1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK

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, =0xE000ED08`
`    ldr 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会被处理器给忽略掉,没有什么实际的作用。为什么还有这么一个参数,主要还是为了保证语法的正确性吧。

相关推荐
To_OC2 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn2 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
এ慕ོ冬℘゜3 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
随心点儿3 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
kyriewen5 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
华清远见IT开放实验室6 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
AI的探索之旅8 小时前
AI辅助原理图评审:电源去耦、BOOT引脚、VCAP——19项逐一核查,遗漏?不存在的
人工智能·vscode·嵌入式硬件
茯苓gao8 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
GeekArch8 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
gis开发之家9 小时前
《Vue3 从入门到大神35篇》Vue3 源码详解(五):effect 依赖收集原理——track 与 trigger 是如何工作的?
javascript·typescript·前端框架·vue3·vue3源码