Hello, I am trying to set the value of SP as part of my small RTOS. However, I have a little problem: once I do this __asm { MOV SP, stkptr } the address stored in stkptr (its type is unsigned int* ) is converted. If the address of strptr is 0xE2D4, SP get 0xF2D4. My stack's top is at 0xFC00. I also disable the check for stack underflow/overflow (registers STKUN, STKOV in the A66 file). What is happening here? Are the DPP registers involved? Can I use memory mapping facilities to solve this issue? Kind regards, Tamir Michael
Hello Chris, Well, I don't have that much experience with the Infineon (I do write embedded stuff but I am new to this chip, and never before wrote a preemptive scheduler). I simply disabled the check in the A66 file, namely: ; MOV STKUN,#DPP3:_TOS ; ; MOV STKOV,#DPP3:(_BOS+6*2) ; This way, I can set SP to different locations in memory (in the area you specified). My prototype seems to work :) I guess I will have to build my own stack overflow/underflow checks in the scheduler (funny code there; mixed assembly and C, because I didn't want to calculate offsets in structures and all that. good enough for now). Thanks for your advise. Tamir
Hi Tamir, Good that you have a solution. I would comment that you stated that you disabled the stack checking but instead you did not trigger a stack trap because you used the MOV instruction. The system will still respond to the stack trap albeit to your new boundary conditions written to registers STKUN and STKOV. As a side note, the XC16x devices don't have this limitation. Best regards, Chris