artag Posted January 18, 2011 Posted January 18, 2011 I'm having some difficulty in using the 'long long' data type on the PPMAC. I'm using IDE 22/07/2010 1.1.1026, firmware 1.2.1.5 and this example code : [code] #include int main(void) { int i; double dd = 0.0; long long ll = 0; for (i = 0; i < 4; ++i) { dd += 1000000001.0; ll = dd; printf("int i %d; double dd %f; long long ll %lld\n", i,dd,ll); } } [/code] I can compile this on another machine (x86 linux), and get the result I expect : [code] int i 0; double dd 1000000001.000000; long long ll 1000000001 int i 1; double dd 2000000002.000000; long long ll 2000000002 int i 2; double dd 3000000003.000000; long long ll 3000000003 int i 3; double dd 4000000004.000000; long long ll 4000000004 [/code] I can also compile it natively on the PPMAC and get the same result. However, if I compile it using the IDE, I get : [code] int i 0; double dd 1000000001.000000; long long ll 0 int i 1; double dd 2000000002.000000; long long ll 0 int i 2; double dd 3000000003.000000; long long ll 0 int i 3; double dd 4000000004.000000; long long ll 0 [/code] I guess this is due to a difference between the cross and native compilers, either due to the crosscompilation or merely an older version. Does the forthcoming IDE release fix this ? -adrian
artag Posted January 18, 2011 Author Posted January 18, 2011 I have now installed the service pack, updating the IDE to 28/09/10 1.1.2.45 and get the same result.
bradp Posted January 18, 2011 Posted January 18, 2011 I changed your code a little to see what part was going wrong. With this you can see the correct values in P0 to P3 which means that the printf is having the problem. Printf is probably using emulation and that might be where the problem originates. I have no solution for that yet but hopefully this information will let you continue. { int i; double dd = 0.0; long long ll = 0; for (i = 0; i < 4; ++i) { dd += 1000000001.0; ll = dd; pshm->P[i]=ll; printf("int i %d; double dd %f; long long ll %lld\n", i,dd,ll); } }
artag Posted January 27, 2011 Author Posted January 27, 2011 [quote='bradp' pid='1118' dateline='1295370455'] I changed your code a little to see what part was going wrong. With this you can see the correct values in P0 to P3 which means that the printf is having the problem. Printf is probably using emulation and that might be where the problem originates. I have no solution for that yet but hopefully this information will let you continue. [code] { int i; double dd = 0.0; long long ll = 0; for (i = 0; i < 4; ++i) { dd += 1000000001.0; ll = dd; pshm->P[i]=ll; printf("int i %d; double dd %f; long long ll %lld\n", i,dd,ll); } } [/code] [/quote] I tried to work on from this, but still failed. The reason becomes apparent if I change the code to [code] dd += 1000000001.01; ll = dd; pshm->P[i]=ll; [/code] This produces the output : int i 20; double dd 1000000001.010000; long long ll 0 int i 21; double dd 2000000002.020000; long long ll 0 int i 22; double dd 3000000003.030000; long long ll 0 int i 23; double dd 4000000004.040000; long long ll 0 But if the values of P20-P24 are queried in the terminal window: P20 P20=1000000001.00999999 P21 P21=2000000002.01999998 Since the fractional part of dd should have been lost when converting to a long long, I suspect that the compiler has optimised the assignment and assigned dd directly to P[n] without going via ll. Is there an option to output the assembler listing so I can check this ? -adrian
dro Posted January 31, 2011 Posted January 31, 2011 We do not manually generate the assembler code as part of the IDE compiler process, but you can do this manually by modifying the make file. the following is what you do to generate and assembler file. 1. Go to you CApp folder on your pc (where the actuall files are physically located) 2. open up the make file. there should be a file such as the following "....._debug.mak" 3. go to the line that has the following script. $(CC) $(CFLAGS) $(DTDEBUG) -c $< 4. Modify the script to the following $(CC) $(CFLAGS) -S $(DTDEBUG) -c $< 5. save the file. 6. open up a command prompt and CD to where this make file is located. 7. execute the following command. make -f"....._debug.mak" clean ex: make -f"capp1_debug.mak" clean 8. execute the following command. make -f"....._debug.mak" ex: make -f"capp1_debug.mak" at this point after building you program, you should see a file with .s extension residing in the same folder. this file is the assembly code of your Capp. note: If you go to the IDE and build your program again, it will recreate your make file and remove the -S option from it. Dro Ghazarian [quote='artag' pid='1219' dateline='1296144644'] [quote='bradp' pid='1118' dateline='1295370455'] I changed your code a little to see what part was going wrong. With this you can see the correct values in P0 to P3 which means that the printf is having the problem. Printf is probably using emulation and that might be where the problem originates. I have no solution for that yet but hopefully this information will let you continue. [code] { int i; double dd = 0.0; long long ll = 0; for (i = 0; i < 4; ++i) { dd += 1000000001.0; ll = dd; pshm->P[i]=ll; printf("int i %d; double dd %f; long long ll %lld\n", i,dd,ll); } } [/code] [/quote] I tried to work on from this, but still failed. The reason becomes apparent if I change the code to [code] dd += 1000000001.01; ll = dd; pshm->P[i]=ll; [/code] This produces the output : int i 20; double dd 1000000001.010000; long long ll 0 int i 21; double dd 2000000002.020000; long long ll 0 int i 22; double dd 3000000003.030000; long long ll 0 int i 23; double dd 4000000004.040000; long long ll 0 But if the values of P20-P24 are queried in the terminal window: P20 P20=1000000001.00999999 P21 P21=2000000002.01999998 Since the fractional part of dd should have been lost when converting to a long long, I suspect that the compiler has optimised the assignment and assigned dd directly to P[n] without going via ll. Is there an option to output the assembler listing so I can check this ? -adrian [/quote]
xiaowei506 Posted May 22, 2012 Posted May 22, 2012 can you use the pmac on the computer(linux), and what is the kernel of linux? [quote='artag' pid='1109' dateline='1295344723'] I'm having some difficulty in using the 'long long' data type on the PPMAC. I'm using IDE 22/07/2010 1.1.1026, firmware 1.2.1.5 and this example code : [code] #include int main(void) { int i; double dd = 0.0; long long ll = 0; for (i = 0; i < 4; ++i) { dd += 1000000001.0; ll = dd; printf("int i %d; double dd %f; long long ll %lld\n", i,dd,ll); } } [/code] I can compile this on another machine (x86 linux), and get the result I expect : [code] int i 0; double dd 1000000001.000000; long long ll 1000000001 int i 1; double dd 2000000002.000000; long long ll 2000000002 int i 2; double dd 3000000003.000000; long long ll 3000000003 int i 3; double dd 4000000004.000000; long long ll 4000000004 [/code] I can also compile it natively on the PPMAC and get the same result. However, if I compile it using the IDE, I get : [code] int i 0; double dd 1000000001.000000; long long ll 0 int i 1; double dd 2000000002.000000; long long ll 0 int i 2; double dd 3000000003.000000; long long ll 0 int i 3; double dd 4000000004.000000; long long ll 0 [/code] I guess this is due to a difference between the cross and native compilers, either due to the crosscompilation or merely an older version. Does the forthcoming IDE release fix this ? -adrian [/quote]
Sina.Sattari Posted May 22, 2012 Posted May 22, 2012 [quote='xiaowei506' pid='3477' dateline='1337686836'] can you use the pmac on the computer(linux), and what is the kernel of linux? [/quote] Can you explain a little better? Do you want to communicate to a PMAC through a Linux PC? What type of PMAC do you have?
Omron Forums Support Posted May 23, 2012 Posted May 23, 2012 Try using %lu for unsigned long and %ld for signed long in your printf command's format specification. E.g. printf("%ld",ll)
Recommended Posts