FreeRTOS学习笔记文档格式.docx
- 文档编号:14939623
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:12
- 大小:794.92KB
FreeRTOS学习笔记文档格式.docx
《FreeRTOS学习笔记文档格式.docx》由会员分享,可在线阅读,更多相关《FreeRTOS学习笔记文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
不用写NULL。
uxPriority:
任务优先级。
值越大优先级越高。
同等优先级时,
按照osheart进行时间片轮转。
xTaskHandle:
任务句柄。
改变该任务优先级、删除任务等时才会
用到。
2.开始多任务
vTaskStartScheduler()
3.如何多任务切换
vTaskDelay(unsignedinttime)
Time为多少个osheart。
4.时间片轮转例子
创建两个任务
xTaskCreate(USART1_Task,"
USART1"
256,(void*)str1,3,NULL);
xTaskCreate(USART2_Task,"
USART2"
256,(void*)str2,3,NULL);
相同优先级,波特率可以设置低一些。
然后就会看到
这就是时间片轮转。
5.系统心跳频率
在FreeRTOSConfig.h第97行的configTICK_RATE_HZ,源码使用1000HZ,就是1ms,如果为200就是200HZ,5ms。
相关宏:
portTICK_RATE_MS。
6.vTaskDelayUntil
和vTaskDelay不同,这个函数不包括函数运行时间,而
vTaskDelayUntil包括。
比如,一个函数A执行时间为2ms,
使用vTaskDelay(10),则再次执行这个函数最少需要等待12ms。
使用vTaskDelayUntil(10),则这2ms包括在内,A以固定10ms周期运行。
使用方法:
红圈的地方就是固定心跳周期。
7.空闲任务钩子函数
voidvApplicationIdleHook(void)
{}
需使能FreeRTOSConfig.h中第126行的configUSE_IDLE_HOOK。
8.消息队列---Queue
包含:
#include"
queue.h"
声明:
QueueHandle_tqMsg;
创建:
qMsg=xQueueCreate(4,2);
//4个队列,每个队列2个成员
发送:
xQueueSendToFront(qMsg,&
Value,1)//最后是超时时间
xQueueSendToBack(qMsg,&
xQueueSend(qMsg,&
成功返回pdPASS;
失败返回errQUEUE_FULL。
注:
中断中的就是在函数名字后加上”FromISR”。
接收:
xQueueReceive(qMsg,&
value,1)
xQueuePeek(qMsg,&
value,1)//不会删除读取的数据
失败返回errQUEUE_EMPTY
删除:
vQueueDelete(qMsg);
查询队列未读数据个数:
unsignedportBASE_TYPEcount=0;
count=uxQueueMessagesWaiting(qMsg);
例程:
按键发送队列消息,接收任务接收到就显示。
按键是两个,这里没有截出来。
9.二值信号量
semphr.h"
SemaphoreHandle_tsSem;
sSem=xSemaphoreCreateBinary();
//创建二值信号量(推荐)
vSemaphoreCreateBinary(sSem);
//创建二值信号量
Give:
portBASE_TYPExHigherPriorityTaskWoken=pdFALSE;
xSemaphoreGiveFromISR(sSem,&
xHigherPriorityTaskWoken);
if(xHigherPriorityTaskWoken==pdTRUE)
;
-----中断方法
xSemaphoreGive(sSem);
-----普通方法
Take:
if(xSemaphoreTake(sSem,1)==pdTRUE)
-----普通方法
删除:
vSemaphoreDelete(sSem);
例程
Timer7每隔3sGive一次BinarySema,LCD任务循环TakeBinarySema,这是中断延迟处理的例子。
10.计数信号量
sSem=xSemaphoreCreateCounting(10,0);
注:
其余方法完全一样,只是创建是不同的。
第一个参数:
计数容量。
第二个参数:
初值。
需要在FreeRTOS.h中第252行的
#defineconfigUSE_COUNTING_SEMAPHORES0。
改为1才可使用。
按键控制Timer7启停,Timer7干的事情就是每隔0.5s去Give一个CountingSema,LED任务就是Take到CountingSema,执行一次LED动作。
当Timer7停止时,LED任务会吧CountingSemaTake到为0为止。
11.互斥信号量
sSem=xSemaphoreCreateMutex();
//创建互斥信号量
需要在FreeRTOS.h中第244行的
#defineconfigUSE_MUTEXES1。
临界资源
USART1_Task先调用Usart_Func函数,里边先获取互斥量,然后打印一句,主动放弃cpu控制权,此时该运行USART2_Task,但是它获取不到互斥量,阻塞,然后再执行USART1_Task部分,执行完成,give互斥量,此时USART2_Task即可打印出来。
例程2
12.事件标志组-Event_Groups
event_groups.h"
EventGroupHandle_teEvent;
//事件标志组句柄
eEvent=xEventGroupCreate();
设置:
xEventGroupSetBits(eEvent,0x01);
//设置标志
等待:
getBits=xEventGroupWaitBits(eEvent,0x01,pdTRUE,pdTRUE,1);
//句柄-等待标志-完成后是否清零标志-是否等待所有标志-超时时间
if((getBits&
0x01)==0x01)
{
//…
}
vTaskDelay(10);
删除:
vEventGroupDelete(eEvent);
如果是等待bit1和bit3,pdTRUE、pdTRUE时(一定要判断if((getBits&
0x09)==0x09)),先发生Bit1事件,getBits就会一直为0x01,然后发生Bit3事件,才会触发然后标志组内部吧对应事件清零;
pdTRUE、pdFALSE时,发生任意一个事件后,触发然后标志组内部吧事件清零。
13.软件定时器
timers.h"
TimerHandle_tt1_Thdl,t2_Thdl,t3_Thdl;
t1_Thdl=xTimerCreate("
Timer1"
200,pdTRUE,(void*)1,(TimerCallbackFunction_t)Timer_Callback);
参数1:
定时器名,调试用到。
参数2:
定时周期。
参数3:
pdTRUE-周期定时器;
pdFALSE-单次定时器。
参数4:
TimerID。
允许多个定时器回调同一个函数,通过ID区分。
参数5:
回调函数地址。
启停:
xTimerStart(t1_Thdl,1);
句柄、等待时间。
xTimerStop(t1_Thdl,1);
复位:
xTimerReset(t1_Thdl,1);
14.内存管理
为了降低内存碎片的产生。
FreeRTOS提供了一套内存分配与释放的方法。
分配:
void*pvPortMalloc(size_txWantedSize)
释放:
voidvPortFree(void*pv)
使用方法同C库的malloc和free。
C库的内存分配方案的弊端
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FreeRTOS 学习 笔记