Cortex‐M3权威指南第一遍阅读后的记录

这本书,买了很久,到现在算是大致浏览了一边,还是非常有收获的,以前都是直接看的芯片的手册,但是芯片手册在内核当中,讲述的知识点是比较少的,因此相互结合的看,很有必要。

这里就自己想到什么就整理什么,肯定有遗漏的,以后有机会看第二遍,再完善。


1    双堆栈的特点,MSP、PSP,看着有点迷糊,两者物理地址是一样,主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)。这个用于操作系统的任务切换,中断处理等用途。 进程堆栈指针(PSP):由用户的应用程序代码使用,自己写的程序的调用时用,比如函数调用子函数。
这个的特点使得基于cm3的芯片就十分适合移植rtos来开发。
2    内存映射,总共就4GB的空间,哈佛结构,部分区域的地址是固定,不允许芯片厂商进行更改,这个和ARM7是有区别的。
3    位带别名,这个可以让操作寄存器有原子特性,十分方便。这个在内核层面就将可靠性提高了,因此相比较8051,avr,pic等,基于cm3的芯片从本质上有了质的飞跃,毕竟怎么说也是32为芯片。
4    有很多寄存器是写1有效,写0无效的,这个特点也增加了可靠性,避免了“读-修改-写”的三部曲,也具有原子性,运行指令的速度也更加快了。
5    systick中断,这个中断就是为移植os而设计的。
6    pendsv、svc中断,这个中断的用途就是在rtos中任务切换的时候用到的。
直接摘录文档中的说明:
个中事件的流水账记录如下:
1. 任务 A 呼叫 SVC 来请求任务切换(例如,等待某些工作完成)
2. OS 接收到请求,做好上下文切换的准备,并且 pend 一个 PendSV 异常。
3. 当 CPU 退出 SVC 后,它立即进入 PendSV,从而执行上下文切换。
4. 当 PendSV 执行完毕后,将返回到任务 B,同时进入线程模式。
5. 发生了一个中断,并且中断服务程序开始执行
6. 在 ISR 执行过程中,发生 SysTick 异常,并且抢占了该 ISR。
7. OS 执行必要的操作,然后 pend 起 PendSV 异常以作好上下文切换的准备。
8. 当 SysTick 退出后,回到先前被抢占的 ISR 中,ISR 继续执行
9. ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换
10. 当 PendSV 执行完毕后,回到任务 A,同时系统再次进入线程模式。
所以rtos中写代码,和裸机是有区别,尤其是外部中断,需要判断是否切换任务,freertos和ucos都是有特定的函数的。
6    各种fault类异常,CM3 中的 Faults 可分为以下几类:
总线 faults
存储器管理 faults
用法 faults
硬 fault
一盘情况遇到的多是hardfault,因为其他fault最后都会升级到硬 fault,那么在调试的时候,就和停机、卡死。书中也整理了各类fault发生的原因汇总,

7    中断,NVIC嵌套中断,顾名思义,中断是有嵌套的,而且有抢占优先级和亚优先级的区分,并且中断延迟大大缩短,有咬尾中断和晚到中断。
8    操作模式和特权极别——还没看懂
9    调试功能,jtag、swd都是兼容的,还有嵌入式跟踪宏单元(ETM)、数据的跟踪单元 DWT(这个该能还有延时计数的功能)、ITM可以输出信息作为调试log,和swo结合比uart输出较快,具体如下;
跟踪组件:数据观察点与跟踪(DWT)
跟踪组件:指令跟踪宏单元(ITM)
跟踪组件:嵌入式跟踪宏单元(ETM)
跟踪组件:跟踪端口接口单元(TPIU)
闪存地址重载与断点单元(FPB)

原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/13433155.html