深度解剖~ FreeRtos阅读笔记1
来源:互联网 发布:住范儿 价格 知乎 编辑:程序博客网 时间:2024/06/15 05:56
上帝不仅给了我一颗低频的cpu还送了个劣质的晶振,可悲可叹!无奈在家休养,不然的话晶振偷停我可就驾鹤西去了。。。不过这也是个好机会,在家靠着窗户晒着太阳,偶尔读读源码,都很好。就是工资没了~
接连几个项目都使用了freertos,作为刚刚毕业一张白纸的我只能先去摸索一些api怎么去调用,需要填入哪些参数,才能达到自己的目的。程序不出问题就完事大吉了,不过稍有异常出现例如某个任务莫名奇妙的被挂起,超出预想,只凭借对api的了解很难追查问题的根源,所以我决定适当深入了解下freertos,顺便学习下大神们的编码风格,免得光头强总说:看你的代码像吃屎。我觉得看一些源码至少能给屎加点孜然。。。
从上电到运行
要让FreeRtos跑起来,首先要。。。给板子上电!
接触了一些芯片,发现它们都是将初始的异常向量表放在自己flash(也有可能是rom)的0地址,芯片复位后直接跳在0地址运行,0地址开始的四个字节存放着c代码运行栈的地址,紧接着是要运行代码段的地址,我先引用一张cortexM3指南的一张图片:
取出的复位地址便是一些汇编引导代码段的首地址,这些代码主要用来初始化一些内存段,把0地址的栈位置赋给MSP,此时才具备C语言运行的环境。随后call main,这才跳入我们所熟悉的main函数。流程大致是这样吧,我并没有实际调试过这些初始化用的汇编代码,因为之前调试的板子都只带了这些文件库:iar下的startup.o,我没有看到源码,遗憾!
最后,引用一句M3指南翻译:“然而,为了动态重分发中断,CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但也可以是 RAM 区。在 RAM区就可以修改向量的入口地址了”。
我们可以和stm8的中断表代码对比下,stm8不支持向量表重定向:
struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
{0x82, NonHandledInterrupt}, /* trap */
{0x82, NonHandledInterrupt}, /* irq0 */
{0x82, NonHandledInterrupt}, /* irq1 */
{0x82, NonHandledInterrupt}, /* irq2 */
{0x82, NonHandledInterrupt}, /* irq3 */
{0x82, NonHandledInterrupt}, /* irq4 */
{0x82, NonHandledInterrupt}, /* irq5 */
{0x82, NonHandledInterrupt}, /* irq6 */
{0x82, NonHandledInterrupt}, /* irq7 */......
如果我们要用中断,就必须在程序编译前将中断处理函数填入到_vectab数组中,一旦程序运行起来这个地址就无法更改,因为它处于代码段。然而重定向后将不会如此刻薄,因为我们可以将向量表存储在ram中。
- 深度解剖~ FreeRtos阅读笔记1
- 深度解剖~ FreeRtos阅读笔记2 任务创建
- 深度解剖~ FreeRtos阅读笔记3 freertos调度器启动、中断优先级管理、中断优先级分组
- 读 C语言深度解剖 笔记1
- c语言深度解剖笔记1
- C语言深度解剖笔记
- 《C语言深度解剖》笔记
- C语言深度解剖--笔记
- c语言深度解剖笔记
- 读《C语言深度解剖》笔记(1)
- C语言深度解剖 学习笔记
- C语言深度解剖学习笔记
- C语言深度解剖 笔记3
- C语言深度解剖 笔记4
- C语言深度解剖 笔记5
- C语言深度解剖 笔记2
- C语言深度解剖学习笔记
- C语言深度解剖学习笔记
- Unity小知识整理==》持续更新
- 二维码的生成与扫描-Android
- location.href的用户总结
- 20170927_快排应用_将数组中的大小写字母分开
- 一个完整的react router 4.0嵌套路由的例子如下
- 深度解剖~ FreeRtos阅读笔记1
- 如何写出优美的 JavaScript 代码?
- Android-live如何利用第三方SDK做一款直播软件
- 最大上升子序和
- Jqgrid之bug,设定单元格数据为空-yellowcong
- Javascript 面向对象编程(一):封装
- 轻量级的 开源缓存框架ASimpleCache
- Innodb Cluster 入门(5) mysql组复制
- 关于MongoDB的默认路径(Ubuntu)