自己做的网站申请软著,sem推广案例,代理加盟网,室内平面设计主要做什么目录 FreeRTOS学习第8篇--同步和互斥操作引子同步和互斥概念实现同步和互斥的机制PrintTask_Task任务相关代码片段CalcTask_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第8篇–同步和互斥操作引子
本文目标#xff1a;学习与使用FreeRTOS中的同步和互斥操… 目录 FreeRTOS学习第8篇--同步和互斥操作引子同步和互斥概念实现同步和互斥的机制PrintTask_Task任务相关代码片段CalcTask_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第8篇–同步和互斥操作引子
本文目标学习与使用FreeRTOS中的同步和互斥操作引子
按照本文的描述应该可以跑通实验并举一反三。
本文实验条件拥有C语言基础装有编译和集成的开发环境比如Keil uVision5
同步和互斥概念
同步用于控制任务执行顺序和时间例如等待其他任务完成某项操作。
互斥用于保护共享资源确保一次只有一个任务能够修改或访问这些资源。
实现同步和互斥的机制
任务通知task notification用于任务之间的等待和唤醒可以传递数据和状态。队列queue用于传递数据任务和ISR都可以放入数据从中读出数据。信号量semaphore用于维持资源的个数生产者和消费者都可以使用。互斥量mutex用于保护共享资源的访问确保一次只有一个任务能够修改资源。
这些知识点后续会继续进行学习。
基于上面的知识点在我自己硬件板子上进行实验完成这个实验的体验。在本次实验中设计两个两个任务任务PrintTask负责打印一些信息任务CalcTask进行计算当计算任务完成计算时将结果传递给任务PrintTask进行显示。
PrintTask_Task任务相关代码片段
void PrintTask(void *params)
{struct TaskPrintInfo *pInfo params;OLED_Init();while (1){
// vTaskDelay(3000); // 进入blockwhile (g_calc_end 0); // 等待计算任务完成/* 打印信息 */if (g_LCDCanUse){g_LCDCanUse 0;OLED_ShowString(pInfo-x,pInfo-y,Sum:,16);OLED_ShowNum((pInfo-x 8 * 6),pInfo-y,g_sum,10,16);OLED_ShowString(pInfo-x,pInfo-y 16,Time(ms): ,16);OLED_ShowNum((pInfo-x 8 * 10),pInfo-y 16,g_time / 1000000,4,16);g_LCDCanUse 1;}OLED_Refresh(); vTaskDelete(NULL);}
}xTaskCreate(PrintTask, task1, 128, g_Task1Info, osPriorityNormal, NULL);static struct TaskPrintInfo g_Task1Info {0, 0, Task1};CalcTask_Task任务相关代码片段
void CalcTask(void *params)
{uint32_t i 0;OLED_ShowString(0, 0, Waiting,16);OLED_Refresh(); g_time system_get_ns();for (i 0; i 10000000; i){g_sum i;}g_calc_end 1; // 计算完成标志g_time system_get_ns() - g_time;vTaskDelete(NULL);
} xTaskCreate(CalcTask, task2, 128, g_Task2Info, osPriorityNormal, NULL);static struct TaskPrintInfo g_Task2Info {0, 16, Task2};实验现象
下载代码到板子上可以看到计算的结果在第一行中进行显示在第二行那里显示了计算这么多个数所需要的时间打印任务PrintTask在计算任务CalcTask没计算完时也抢占cpu资源导致计算会有些慢这里我根据计算的结果简单粗暴的加了相应的延迟vTaskDelay(3000); // 进入block使打印任务一开始先阻塞着不抢占cpu资源计算速度会快一些。当然这只是一种例子有一定的缺陷当作学习使用。
本文完 本文中使用的测试工程