《2023年FreeRTOS学习笔记.docx》由会员分享,可在线阅读,更多相关《2023年FreeRTOS学习笔记.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、FreeRTOS学习笔记使用注意:FreeRTOS与ucOS相比,需要修改启动文献。1. 任务创建包含FreeRTOS.h /这个是必须要包含的/ 和task.h。调用API函数:xTaskCreatepvTaskCode:函数指针(函数名)。pcName:描述性任务名,只是用于辅助调试。可以通过FreeRTOSConfig.h第100行的configMAX_TASK_NAME_LEN来改变描述名长度。usStackDepth:任务栈大小。建议为64的整数倍。pvParameters:任务参数,void * 类型。不用写NULL。uxPriority:任务优先级。值越大优先级越高。同等优先级时
2、,按照os heart进行时间片轮转。xTaskHandle:任务句柄。改变该任务优先级、删除任务等时才会用到。不用写NULL。2. 开始多任务vTaskStartScheduler()3. 如何多任务切换调用API函数:vTaskDelay(unsigned int time)Time为多少个os heart。4. 时间片轮转例子创建两个任务xTaskCreate(USART1_Task, USART1, 256, (void *)str1, 3, NULL);xTaskCreate(USART2_Task, USART2, 256, (void *)str2, 3, NULL);相同优先级
3、,波特率可以设立低一些。然后就会看到这就是时间片轮转。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周期运营。使用方
4、法:红圈的地方就是固定心跳周期。7. 空闲任务钩子函数void vApplicationIdleHook(void)需使能FreeRTOSConfig.h中第126行的configUSE_IDLE_HOOK。8. 消息队列-Queue包含:#include queue.h声明:QueueHandle_t qMsg;创建:qMsg = xQueueCreate(4, 2); /4个队列,每个队列2个成员发送:xQueueSendToFront(qMsg, &Value, 1)/最后是超时时间xQueueSendToBack(qMsg, &Value, 1)/最后是超时时间xQueueSend(q
5、Msg, &Value, 1)/最后是超时时间成功返回pdPASS;失败返回errQUEUE_FULL。注:中断中的就是在函数名字后加上”FromISR”。接受:xQueueReceive(qMsg, &value, 1)xQueuePeek(qMsg, &value, 1) /不会删除读取的数据成功返回pdPASS;失败返回errQUEUE_EMPTY注:中断中的就是在函数名字后加上”FromISR”。删除:vQueueDelete(qMsg);查询队列未读数据个数:unsigned portBASE_TYPE count = 0;count = uxQueueMessagesWaiting
6、(qMsg);例程:按键发送队列消息,接受任务接受到就显示。按键是两个,这里没有截出来。9. 二值信号量包含:#include semphr.h声明:SemaphoreHandle_t sSem;创建:sSem = xSemaphoreCreateBinary(); /创建二值信号量(推荐) vSemaphoreCreateBinary(sSem); /创建二值信号量Give:portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;xSemaphoreGiveFromISR(sSem, &xHigherPriorityTaskWoken);if(xHi
7、gherPriorityTaskWoken = pdTRUE);-中断方法xSemaphoreGive(sSem);-普通方法Take:portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;xSemaphoreGiveFromISR(sSem, &xHigherPriorityTaskWoken);if(xHigherPriorityTaskWoken = pdTRUE);-中断方法if(xSemaphoreTake(sSem, 1) = pdTRUE)-普通方法删除:vSemaphoreDelete(sSem);例程Timer7每隔3sGive一次
8、BinarySema,LCD任务循环Take BinarySema,这是中断延迟解决的例子。10. 计数信号量包含:#include semphr.h声明:SemaphoreHandle_t sSem;创建:sSem = xSemaphoreCreateCounting(10, 0);注:其余方法完全同样,只是创建是不同的。第一个参数:计数容量。第二个参数:初值。需要在FreeRTOS.h中第252行的#define configUSE_COUNTING_SEMAPHORES0。改为1才可使用。例程按键控制Timer7启停,Timer7干的事情就是每隔0.5s去Give一个CountingSe
9、ma,LED任务就是Take到CountingSema,执行一次LED动作。当Timer7停止时,LED任务会吧CountingSema Take到为0为止。11. 互斥信号量包含:#include semphr.h声明:SemaphoreHandle_t sSem;创建:sSem = xSemaphoreCreateMutex(); /创建互斥信号量注:其余方法完全同样,只是创建是不同的。需要在FreeRTOS.h中第244行的#define configUSE_MUTEXES 1。改为1才可使用。例程:临界资源USART1_Task先调用Usart_Func函数,里边先获取互斥量,然后打印
10、一句,积极放弃cpu控制权,此时该运营USART2_Task,但是它获取不到互斥量,阻塞,然后再执行USART1_Task部分,执行完毕,give互斥量,此时USART2_Task即可打印出来。例程212. 事件标志组-Event_Groups包含:#include event_groups.h声明:EventGroupHandle_t eEvent; /事件标志组句柄创建:eEvent = xEventGroupCreate();设立:xEventGroupSetBits(eEvent, 0x01); /设立标志等待:getBits = xEventGroupWaitBits(eEvent,
11、 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. 软件定期
12、器包含:#include timers.h声明:TimerHandle_t t1_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_t xWantedSize)释放:void vPortFree(void *pv)使用方法同C库的malloc和free。C库的内存分派方案的弊端