CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Problem creating copy of integer math routines using #org

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
EdWaugh



Joined: 07 Dec 2004
Posts: 127
Location: Southampton, UK

View user's profile Send private message

Problem creating copy of integer math routines using #org
PostPosted: Thu Jan 19, 2012 12:14 pm     Reply with quote

Hi all,

I'd like to create a second copy of the MUL1616 and DIV1616 math routines for use in an interrupt, I reviewed the post by PCM Programmer and Ttelmah and thought I got it right, but I still get the warning message.

The posts I'm referring to are:

http://www.ccsinfo.com/forum/viewtopic.php?t=25464&highlight=math+library
http://www.ccsinfo.com/forum/viewtopic.php?t=30539

I may be pushing my luck by expecting the compiler to automatically pull in all the functions my interrupt routine calls.

Anyway perhaps someone can shine some light on it for me:

Code:

#pragma org 0x1000, 0x2000 default
#pragma int_ccp8
void ctrl_loop_40Hz()
{
   output_high(GPIO0);

   // Valve Actuator
   va_ctrl();
   va_he_poll();

   // Pumps
   bp_ctrl();
   psp_ctrl();

   output_low(GPIO0);
   return;
}
#pragma org default


Also, is there a way to have the #org size itself so I don't need to provide an end address?

Thanks

Ed
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Jan 19, 2012 1:33 pm     Reply with quote

Comment out lines of code in your isr, one-by-one, and re-compile until
you find the offending line. Then post a small complete program that
shows the problem.
EdWaugh



Joined: 07 Dec 2004
Posts: 127
Location: Southampton, UK

View user's profile Send private message

PostPosted: Fri Jan 20, 2012 2:51 am     Reply with quote

I guess that means what I've done must look ok. I think the problem is that I have not explictly included the called functions in the #org section, I thought they would get pulled in.

So this does not give a warning:

Code:

#pragma org 0x1000, 0x2000 default
#pragma int_ccp8
void ctrl_loop_40Hz()
{
   psp_state.speed_error_p = (psp_speed_error * ws_params.psp_ctrl_p) / PSP_GAIN_POST_SCALAR;
}
#pragma org default


But this does:

Code:


void mul_test()
{
   psp_state.speed_error_p = (psp_speed_error * ws_params.psp_ctrl_p) / PSP_GAIN_POST_SCALAR;
}

#pragma org 0x1000, 0x2000 default
#pragma int_ccp8
void ctrl_loop_40Hz()
{
   mul_test();
}
#pragma org default


Should the function get dragged into the #org automatically because I call it there? That would certainly be nice... Otherwise I guess I have to figure out how to tag several functions across different modules to be in the same #org.

Also, any syntax for not having to set the size of the #org? Surely the compiler could do this for me?

Cheers

Ed
EdWaugh



Joined: 07 Dec 2004
Posts: 127
Location: Southampton, UK

View user's profile Send private message

PostPosted: Fri Jan 20, 2012 8:02 am     Reply with quote

Hi all,

So I managed to make this work but putting each individual function explicitly within the same #org. This seems to work as the warnings go away and I can see interrupt calls going to an address within the area and non interrupt calls going to one outside the area. Can anyone recommend another way I can check this?

Also, any thoughts on the auto sizing of the ROM area? It would be much more convenient.

Also, also, how about the best location for the area? My boot loader is at the top of the space, I just selected 0x1000 randomly as away from 0x0000, but I guess I might get some defragmentation around the block.

All suggestions welcome.

Thanks

Ed
Ttelmah



Joined: 11 Mar 2010
Posts: 19369

View user's profile Send private message

PostPosted: Fri Jan 20, 2012 8:20 am     Reply with quote

OK.
The 'point' about the #ORG, is that the code 'generated' by the functions in this section are stored in the defined memory area.
Problem is that if you define a subroutine, the code in the area 'calls' this subroutine, but the routine itself is 'generated' by the code that defines it, so is not inherently in the area defined.
You can make a function be included in the defined area, by declaring it as '#inline', which will force the code to actually be placed where it is called.

As a comment, stop using #pragma. _it has no effect at all on the CCS compiler_. It is only allowed so the compiler won't 'complain' when compiling code written for other compilers, and does nothing at all. Just makes the code look messy, and implies the author hasn't read the manual....

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group