Hello,
I need help figuring out how to record the current state of the processor registers so they can later be restored at the specific location in code. This will act like a warm reset but starting after initializing all my devices. Below are the functions used on the ARM9 processor. I need to do the same with the Cortext M7 processor. I am using Keilv5 with RTX5 RTOS in my project. Any examples or tips would be appreciated.
Will I also need to clear the stack?
//Record current state of processor registers. These registers can be restored at any
//time using the popcregs routine and should cause the program to the spot in code that
//the pushcregs was called.
__asm void pushcregs(PROC_STATE *regs)
{
STMIA R0!,{R0-R15} //save register values in data structure
STMDB SP!,{R0-R1} //Save R0 & R1 on stack
MRS R1,CPSR //move contents of CPSR to R1
STMIA R0!,{R1} //save PSR in data structure
MRS R1,SPSR //Move contents of saved PSR to R1
STMIA R0!,{R1} //save contents in data structure
LDMIA SP!,{R0-R1} //restore registers R0 & R1
BX LR //return
}
__asm void popcregs(PROC_STATE *regs)
{
LDR R1,[R0,#(17*4)] //point to end of data structure
MSR SPSR_c,R1 //restore SPSR
LDR R1,[R0,#(16*4)] //load CPSR into R1
MSR CPSR_c,R1 //restore CPSR
ADD R0,R0,#4 //do not restore PC
LDMIA R0!,{R1-R14} //restore R1 thru R14
BX LR //return to top of program
}
已解决! 转到解答。
Update:
I found these two functions which is what I needed for my project. Using setjmp and longjmp, I can branch back in my code.
#include "setjmp.h"
setjmp(jmp_buf);
longjmp(jmp_buf, return);
Update:
I found these two functions which is what I needed for my project. Using setjmp and longjmp, I can branch back in my code.
#include "setjmp.h"
setjmp(jmp_buf);
longjmp(jmp_buf, return);
Hi,
Thank you for your interest in NXP Semiconductor products and for the opportunity to serve you.
1) Will I also need to clear the stack?
-- No, I'm afraid not. Regarding the Cortex-M core-based MCU, the compiler can manage the stack during the function context operation via utilizing the registers in the cores (as below shows). When the MCU runs the RTOS which provides the stack management for the created task, in addition to the above stack management.
Have a great day,
TIC
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Hi,
Thanks for your reply.
1) Are there any examples of saving and restoring the stack pointer and all the registers?
-- No, however, you can learn stack management via reviewing the assembly code of the related C language code function.
Have a great day,
TIC
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------