FreeRTOS学习笔记(一)

9 篇文章 4 订阅
2 篇文章 0 订阅

FreeRTOS学习笔记

第一天摘要:

Key:

移植方法,TCB的结构及创建,任务栈,列表和列表项定义及相关函数

实践:rtos移植执行led闪烁

注意点:keil下载device要正确;内存不够删去不需要的heap.c及其他内 核等多余文件(MemMang,RVDS)

代码风格:

FreeRTOS 中详细的数据类型重定义在 portmacro.h 这个头文件中实现,具体 如下

1.2.4.2 变量名 在 FreeRTOS 中,定义变量的时候往往会把变量的类型当作前缀加在变量上, 这样的好处是让用户一看到这个变量就知道该变量的类型。比如 char 型变量的 10 前缀是 c,short 型变量的前缀是 s,long 型变量的前缀是 l,portBASE_TYPE 类 型变量的前缀是 x。还有其他的数据类型,比如数据结构,任务句柄,队列句柄 等定义的变量名的前缀也是 x。 如果一个变量是无符号型的那么会有一个前缀 u,如果是一个指针变量则会 有一个前缀 p。因此,当我们定义一个无符号的 char 型变量的时候会加一个 uc 前缀,当定义一个 char 型的指针变量的时候会有一个 pc 前缀。 1.2.4.3 函数名 函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是 私有的函数则会加一个 prv(private)的前缀。特别的,在函数名中加入了函 数所在的文件名,这极大的帮助了用户提高寻找函数定义的效率和了解函数作用 的目的,具体的举例如下: ①vTaskPrioritySet()函数的返回值为 void 型,在 task.c 这个文件中定 义。 ②xQueueReceive()函数的返回值为 portBASE_TYPE 型,在 queue.c 这个 文件中定义。 ③vSemaphoreCreateBinary()函数的返回值为 void 型,在 semphr.h 这个 文件中定义。

移植:

FreeRTOSConfig.h 是直接从 demo 文件夹下面拷贝过来的,该头文件对裁 剪整个 FreeRTOS 所需的功能的宏均做了定义,有些宏定义被使能,有些宏定义 被失能,一开始我们只需要配置最简单的功能即可。要想随心所欲的配置 FreeRTOS 的功能,我们必须对这些宏定义的功能有所掌握,下面我们先简单的 介绍下这些宏定义的含义,然后再对这些宏定义进行修改。 注意:此 FreeRTOSConfig.h 文件内容与我们从 demo 移植过来的 FreeRTOSConfig.h 文件不一样,因为这是我们修改过的 FreeRTOSConfig.h 文 件,并不会影响 FreeRTOS 的功能,我们只是添加了一些中文注释,并且把相关 的头文件进行分类,方便查找宏定义以及阅读,仅此而已。强烈建议使用我们修 加工过的 FreeRTOSConfig.h 文件。若你在移植时直接使用我们工程中 FreeRTOSConfig.h 文件,编译会出现报错,因为里面 PendSV_Handler 和 SVC_Handler 函数重定义,需在 stm32f10x_it.c 文件中注释掉这两个函数方可, 后面会有讲解,此处先略过

还需要注意的是:中断优先级 0(具有最高的逻辑优先级)不能被 basepri 寄存器屏蔽,因此,configMAX_SYSCALL_INTERRUPT_PRIORITY 绝不可以设置成 0。

修改 stm32f10x_it.c 文件 SysTick 中断服务函数是一个非常重要的函数,FreeRTOS 所有跟时间相关的 事情都在里面处理,SysTick 就是 FreeRTOS 的一个心跳时钟,驱动着 FreeRTOS 的运行

FreeRTOS 帮 我们实现了 SysTick 的启动的配置:在 port.c 文件中已经实现 vPortSetupTimerInterrupt()函数,并且 FreeRTOS 通用的 SysTick 中断服务 函数也实现了:在 port.c 文件中已经实现 xPortSysTickHandler()函数,所以 移植的时候只需要我们在 stm32f10x_it.c 文件中实现我们对应(STM32)平台 上的 SysTick_Handler()函数即可

延时函数实现:

//reload 为 24 位寄存器,最大 值:16777216,在 72M 下,约合 0.233s 左右

void delay_us(u32 nus) {

u32 ticks;

 u32 told,tnow,tcnt=0;

u32 reload=SysTick->LOAD; //LOAD 的值

ticks=nus*fac_us; //需要的节拍数

told=SysTick->VAL; //刚进入时的计数器值

while(1) {

tnow=SysTick->VAL;

if(tnow!=told) {

if(tnow<told)tcnt+=told-tnow; //这里注意一下 SYSTICK 是一个递 减的计数器就可以了.

else tcnt+=reload-tnow+told;

told=tnow;

if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则 退出. } }; }

delay_us()是 us 级延时函数,delay_ms 和 delay_xms()都是 ms 级的延 时函数,delay_us()和 delay_xms()不会导致任务切换。delay_ms()其实就是对 FreeRTOS 中的延时函数 vTaskDelay()的简单封装,所以在使用 delay_ms()的 时候就会导致任务切换

任务栈其实就是一个预先定义好的全局数组,数据类型为 StackType_t,大小由 TASK1_STACK_SIZE 这个宏来定义,默认为 128,单位为 字,即 512 字节,这也是 FreeRTOS 推荐的最小的任务栈。在 FreeRTOS 中, 凡是涉及到数据类型的地方,FreeRTOS 都会将标准的 C 数据类型用 typedef 重新取一个类型名。这些经过重定义的数据类型放在 portmacro.h 这个头文件。

正如我们所说的那样,任务是一个独立的、无限循环且不能返回的函数

3.2.3 定义任务控制块

typedef struct tskTaskControlBlock {

volatile StackType_t *pxTopOfStack; /* 栈顶 */ (1)

ListItem_t xStateListItem; /* 任务节点 */ (2)

StackType_t *pxStack; /* 任务栈起始地址 */ (3)

/* 任务名称,字符串形式 */(4)

char pcTaskName[ configMAX_TASK_NAME_LEN ];

} tskTCB; typedef

3.2.4 列表和列表项 :

要想看懂 FreeRTOS 源码并学习其原理,有一个东西需要理解,那就是 FreeRTOS 的列表和列表项。列表和列表项是 FreeRTOS 的一个数据结构, FreeRTOS 大量使用到了列表和列表项,它是 FreeRTOS 的基石。要想深入学习 并理解 FreeRTOS,那么列表和列表项就必须首先掌握,否则后面根本就没法进 行

列表项就是存放在列表中的项目,FreeRTOS 提供了两种列表项:列表项和 迷你列表项。这两个都在文件 list.h 中有定义

3.2.4.2.1 列表初始化 新创建或者定义的列表需要对其做初始化处理,列表的初始化其实就是初始 化列表结构体 List_t 中的各个成员变量,列表的初始化通过函数 vListInitialise()来完成,此函数在 list.c 中有定义(P58

3.2.4.3.1 列表项插入函数 列表项的插入操作通过函数 vListInsert()来完成,函数原型如下:

通过图可以看出,列表是一个环形的,即环形列表

vListInsertEnd()插入列表的顺序问题(P66

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

switch_swq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值