View previous topic :: View next topic |
Author |
Message |
Arizona Chris
Joined: 20 Dec 2014 Posts: 69 Location: Arizona
|
Math.h just took up all my ROM. Any suggestions? |
Posted: Sun Jun 28, 2015 11:41 am |
|
|
Greetings all,
we had to include the math.h so we could use the arctan2() function, but then my code went from 40% full on the ROM to 80%. OH my. I just need the one function, not the whole darn library. Is there any way to just include the arctan2 function? Im out of code space on my 877a chip.
Chris |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Sun Jun 28, 2015 12:03 pm |
|
|
Two quick solutions...
1) upgrade to a newer PIC. The 877 is a dinosaur like me, almost obsolete...
2) You should be able to 'cut and paste' the compiled arctan() function and call it from your program. I did this kind of thing decades ago with a Z80 based product. Didn't need the whole library, just a couple math functions.
I did 'think' that only the required math routines would be compiled though, maybe Mr. T or PCMP will reply with the facts...me, I'm still mopping up from 'the storm'.
Jay |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jun 28, 2015 1:37 pm |
|
|
Quote: | I did 'think' that only the required math routines would be compiled |
That's correct. If you only use atan(), then only that math.h routine will
be compiled. I did that in a test program and got 16% program memory
usage. Using atan2(), I got 20% usage. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Sun Jun 28, 2015 2:25 pm |
|
|
I posted here a reduced size atan function a while ago.
<http://www.ccsinfo.com/forum/viewtopic.php?t=50920&highlight=atan>
This is a lot smaller and quicker than the standard function. |
|
|
Arizona Chris
Joined: 20 Dec 2014 Posts: 69 Location: Arizona
|
math.h |
Posted: Sun Jun 28, 2015 4:51 pm |
|
|
Does this mean that I can open math.c, then find the arctan2 function and copy just this part to my program - or do I need the header at the top as well?
Yes, I know I have ONE LAST 877a I am trying to use up! I bought a whole tube of the 887 chips and have on order the 40p dip version of the 16F1789 for future projects.
Chris |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jun 28, 2015 5:31 pm |
|
|
You have to read all the replies, not just part of the first one.
You have to notice the backpedaling on the musings. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Mon Jun 29, 2015 1:58 am |
|
|
Also as a comment, think about the size you are getting.
PCM_programmer has already tested and shown that atan, only takes 16% of the ROM on your chip. I'd guess that when you added the actual atan, you added a whole line (or multiple lines), involving quite a bit more maths. Probably a few multiplications and divisions to actually get the number you want, or scale the result. Result the extra size.
You need to be looking at all these other factors, and thinking a bit. Though the library only includes the parts it wants, and once you have included the atan, using it again doesn't load a second copy, it does means all the setup code copying things to registers and from registers etc.. Look at your actual maths and see whether there is any way of simplifying (remember for instance that *0.1, will use less space than /10.0). Simple things like printf, using a floating point number can get quite bulky.
For example, a simple test with a float number being counted through a for..next loop, multiplied and printed (%6.2), takes just over 1Kbytes on a PIC. However take the same number (still doing the maths in float), and multiply it by 100, into an int32, and print this with '%6.2lw', and it saves space!...
Code: |
int32 temp; //val and val2 as floats
while(1)
{
val2=val2*val;
temp=val2*100;
printf("%6.2lw\n",temp);
delay_ms(1000);
}
//versus
while(1)
{
val2=val2*val;
printf("%6.2f\n",val2);
delay_ms(1000);
}
|
Saves 94 bytes!...
Now coding (say) as:
Code: |
val2=val2*0.1;
//versus
val2=val2/10;
|
saves 346 bytes!....
This extra usage for mundane things is often forgotten... |
|
|
Arizona Chris
Joined: 20 Dec 2014 Posts: 69 Location: Arizona
|
math |
Posted: Mon Jun 29, 2015 6:29 am |
|
|
Thanks again all of you for your informative replies! Carefull extraction of uneeded functions allowed us to make just enough extra ROM to finish the job fine. in this case, an extra 10% made all the difference.
The best news on all of this is that I have now finished up our stock on the "dinosaur" 877a chips. Until we get another far more modern PIC in our hands (next week) we will be using up our supply of 887 chips. Maybe a mastadon, but NOT a dinosaur! ;)
Chris |
|
|
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Mon Jun 29, 2015 9:03 am |
|
|
Depending on what you think your time is worth, it is often cheaper to simply throw the old stock out and replace it with newer chips for the next project instead of holding on to that little T-rex.
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Mon Jun 29, 2015 1:04 pm |
|
|
my progression in 40 pin was
877->887 -> 18f4620 --> 18f46k22
I've gotten quite used to doing anything reasonable to NOT use floats....
A favorite is to scale analog gains in power of 2 for a 16 bit ADC
then multiply the ADC word by 100 or 1000 - and use shifts of a a 32 bit unsigned integer, formatted with decimal placement to true value for printf output.
The last time i suffered with the advanced math routines was computing arctan of omega in a complex impedance device. Ultimately it made more sense to send an impedance and frequency value to the host PC and do the heavy math lifting elsewhere than in the MCU |
|
|
Arizona Chris
Joined: 20 Dec 2014 Posts: 69 Location: Arizona
|
Math.h |
Posted: Fri Jul 03, 2015 6:40 pm |
|
|
asmboy - Thats a good point, I try not to use floats unless I really need the accuracy. In my case, I had to use arctan2() to get the compass bearing and speed was not an issue for a magnetometer.
I JUST got my new MachX programmer today - and WOW! So used to my old pic start plus from microchip - DB9 serial is soooo slow. No more T rex chips for me. I bought a tube of 887s and have on order some 16F1789 devices for my power house projects. I really like working with C, and the CCS-C always impresses me every time I learn something new. I'm picking it up really fast, as you can see from my Library upload on the magnetometer.
Chris |
|
|
|