我想通过调试,看一下线程切换时线程栈、主堆栈、各个寄存器的变化,但是不知道怎么操作,谢谢。
我看权威指南里说
此时,进入异常时的自动压栈使用的是进程堆栈,进入异常 handler 后才自动改为 MSP,退出异常时切换回PSP,并且从进程堆栈上弹出数据
我写了个程序,想调试,看一下入栈以后,保存在哪里。但是运行之后,静态数组,也就是线程栈里的内容,和调试时候registers里的内容不一样啊,请问我应该在哪里打断点?
#define LED0_PIN GET_PIN(F, 9)
#define LED1_PIN GET_PIN(F, 10)
ALIGN(RT_ALIGN_SIZE)
char thread2_stack[160];
struct rt_thread thread2;
char thread1_stack[160];
struct rt_thread thread1;
/* 线程 2 入口 */
static void thread2_entry(void *param)
{
rt_uint32_t count = 0;
while(1)
{
count++;
count++;
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
}
/* 线程 2 入口 */
static void thread1_entry(void *param)
{
rt_uint32_t count = 0;
while(1)
{
count++;
count++;
rt_pin_write(LED1_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED1_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
}
int main(void)
{
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
/* 初始化线程 2,名称是 thread2,入口是 thread2_entry */
rt_thread_init(&thread2,
"thread2",
thread2_entry,
RT_NULL,
&thread2_stack[0],
sizeof(thread2_stack),
21, 20);
/* 初始化线程 1,名称是 thread1,入口是 thread1_entry */
rt_thread_init(&thread1,
"thread1",
thread1_entry,
RT_NULL,
&thread1_stack[0],
sizeof(thread1_stack),
21, 20);
rt_thread_startup(&thread1);
rt_thread_startup(&thread2);
}
打到pendsv里边,也不太对。
硬件入栈的寄存器,r0 ——r3 等,也是进入线程栈里吧,这个过程怎么看呢?
@伊森亨特
我只能想到两个可能的方法,但没有试过去观察硬件入栈的8个寄存器。
关闭其他中断,保留一个main线程,一个idle线程,仅通过systick和pendsv来进行观察。
自行触发一条SVC指令。
我以前写过一篇短文,和你的需求有一点点相关,仅供参考:
https://club.rt-thread.org/ask/article/2493d824711da9a2.html