赞
踩
全部学习汇总: GreyZhang/g_FreeRTOS: learning notes about FreeRTOS. (github.com)
前面简单分析过任务创建函数的实现,在函数的最后有一个操作是对任务的初始化处理。这一次分析一下这个初始化的函数。
这里需要说一下的是,这个MPU我查看M3的内核手册的时候是看到了的,可能这个是M3内核都有的一个模块。当然,我看到的暂时是章节标题暂时还没有去仔细阅读。可能,这个模块在这个MCU上是可以用起来的。
这一段没有实质的意义,目前的工程中没有生效。不过,从这里能够看到这个数据填充的处理方式,那就是填充为0xA5。
进行堆栈的处理,主要是处理堆栈的栈顶。掩码的作用是为了能够保证堆栈指针的数值是8字节对齐的,而这个对齐是硬件属性决定的。
这一段是实现了任务名称的拷贝处理,考虑了一定的效率因素。
这是对优先级的处理,其中也检查了优先级是否是在一个合理的范围内。另外,也处理了互斥信号涉及到的优先级。这部分可能后面还得专门分析一下具体的作用,目前还不知道这个互斥信号的实现方式或机理。
处理状态、事件的链表信息,首先进行了初始化的操作,接下来指明了任务控制块状态信息以及时间信息的归属对象。同时,处理了用于排序的数值,这个数值是跟优先级最大值以及优先级的减数值相关的。
这部分代码都是没使能的,可以直接跳过。不过这里有一条是使能了的,那就是任务通知功能。通知状态有三种状态的可能:不等待通知、等待通知、接收到通知。
这里有两部分生效的地方,第一个是任务堆栈的初始化,另一个是任务句柄的处理。其中,任务句柄的处理比较简单,只要是对象不是NULL,那么指向任务控制块。关于堆栈的处理,后面另作分析。
上面这一部分信息来自于M3的内核手册,当exception产生的时候,内核会有一个堆栈的处理。而这个时候进入到对战区域的寄存器按照顺序就是上图的顺序,而这个也是前面看到的堆栈初始化的处理顺序。
这部分的赋值信息是如何来的呢?这个也需要看内核手册,但是不在exception的章节了。
xPSR是三个寄存器的信息,从上面的信息看,三个寄存器的bit位正好不是重合的位置。因此,正好可以通过一个寄存器进行存储。前面代码中的赋值,正好是bit24,也就是T。这个bit置位的作用是用以指示采用Thumb指令集。
这部分文档是对前面的说法的说明信息。
这样,任务初始化以及堆栈初始化的信息的分析就完成了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。