1264_FreeRTOS任务的初始化以及堆栈初始化处理分析

全部学习汇总: 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指令集。

这部分文档是对前面的说法的说明信息。

这样,任务初始化以及堆栈初始化的信息的分析就完成了。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值