做蛋糕网站的 实训报告图,做的好的手机网站有哪些,app制作公司报价,莱芜信息港房产网1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK 全部学习汇总#xff1a; g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 上面是涉及到的源代码#xff0c;而这次需要分析的就是78、79行的两个中断。首先#xff0c;需要确认NVIC_SYSPRI2寄存器的作用。 进一… 1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK 全部学习汇总 g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 上面是涉及到的源代码而这次需要分析的就是78、79行的两个中断。首先需要确认NVIC_SYSPRI2寄存器的作用。 进一步看里面相关的定义从这里看这个注释与代码出现了不一致的地方。也就是这个0xe000ed20地址究竟是哪一个寄存器的地址注释与代码的描述并不相同。 这么看注释写的应该是更加准确一些。 这里进一步补充一下对应的寄存器信息如上述截图。 void print_regs_info(void)
{printf(portNVIC_PENDSV_PRI %x\n, portNVIC_PENDSV_PRI);printf(portNVIC_SYSTICK_PRI %x\n, portNVIC_SYSTICK_PRI);
}增加上面的代码直接打印一下结果如上。那么上面的两个寄存器设置其实是把高位的两个字节全都设置为了每一个bit都是1。 再次结合这一个信息上面的操作有效的部分其实是把这两个字节的高4bit全都设置为了1。 再结合这部分信息可以看得出来注释的描述其实是对的。这两个语句的操作实现的功能更是把Systick以及PendSV中断的优先级设置为15也就是最低。其实功能分析到此现在这两个中断的优先级究竟应该设置为多少是合理的暂且还是不明确的。 接下来再看一下启动第一个任务的实现。首先看93行这个是KEIL中的一个伪指令主要实现的功能是保证汇编代码中的堆栈能够按照8字节对齐。那么0xE000ED08这个地址是哪个寄存器呢按照注释直接找一下文档看看是否一致。 首先确认SCB的基地址接下来看偏移量。 偏移量从手册中查出来是0x08因此两个组合出来的这个地址就是SCB_VTOR的地址。那么这个寄存器中的数值现在是多少呢直接通过代码打印一下对应的测试代码 void print_regs_info(void)
{/*ldr r0, 0xE000ED08ldr r0, [r0]ldr r0, [r0]*/ uint32_t reg_value 0xE000ED08; printf(result 1: 0x%x\n, reg_value);reg_value *((uint32_t *)reg_value);printf(result 2: 0x%x\n, reg_value);reg_value *((uint32_t *)reg_value);printf(result 3: 0x%x\n, reg_value);
}调用的位置在调度器启动之前。 这是打印出来的效果。 这样继续之前的汇编第102行。这一个操作实现的额是给msp设置数值为0x20001780。 这个地址区从手册中可以查出来是SRAM的区域这样这一句实现的作用就是设置了堆栈在RAM区域的位置。 这跟直接从仿真器中看到的寄存器数值也是一致的。各种仿真器千差万别有时候觉得最顺手的似乎还是printf。 上面的这个MSP的操作看起来的确是有一点莫名其妙或许是为了兼容不同的启动代码而设计 继续往下主动产生一次系统调用。这里的参数0会被处理器给忽略掉没有什么实际的作用。为什么还有这么一个参数主要还是为了保证语法的正确性吧。