1-ARM架构、堆与栈
(只想记录栈,其他的也没怎么看懂)
1-如何避免LR寄存器被覆盖:
每个函数调用前,都会给LR寄存器赋值,作为归来的地址,,但若是嵌套调用就被覆盖了,于是再每次函数调用前没通过汇编代码PUSH,来保存LR还有重要寄存器(其实就是将即将调用的函数的栈的开头向后推,这样就不会被覆盖了)
2-怎么记录变量
不允许优化或存满的(可能是)直接存到内存中,允许优化且没有满的时候,存到寄存器中去(没学明白,回头再问再看)
3-RTOS为何每一个任务都要有单独的栈
因为在调度过程中需要不断从中间切换代码,所以所有的东西都需要不断的保存(保存现场),设定栈之后,就有一段独立稳定的空间可以保存了
2-源码阅读与内存管理
1-核心文件位置
这是IDE配置文件,同样需要移植
2-类型前缀、函数前缀、宏的前缀、基本数据类型
BaseType是此核心最流畅基本的类型,比如在stm32上就是int(32位)
TickType时钟类型(忘记了)
03-创建任务,写任务调度函数
1-创建任务的函数
重点:任务函数(做什么),栈(在那儿做),优先级
在RTOSInit,初始化函数中写任务列表,以后通过链表寻找相关的任务
02-栈大小估算
主要包括:
每次需要保留的寄存器空间等(最大为R4~R11+LR)(主要通过深度最大的一条来估算)
局部变量占据的空间(具体怎么叠加忘了)
保留现场需要的空间(通常为16*4=64byte)
4-写的时候遇到的问题:
1-忘记了参数啥意思:
这三个地方什么意思
答:最后一个地方参数写错了,不是TCB结构体的句柄,随即区域函数不需要这个,直接放句柄就行
2-报错:
明白了,报错是因为调用的创造任意区域的任务,而我参考的却是创造固定区域的任务的函数,所以最后地方的参数应该是句柄,前面应该是basetype的参数(不知道什么用)
所以有什么用呢,这个ret?
3-句柄在这儿定义就行