FreeRTOS 学习之二:二值信号量 前提:默认已经装好MDK V5 和STM32CubeMX,并安装了STM32F1xx系列的支持包。 硬件平台:STM32F1xx系列。 目的:学习使用二值信号量进行任务同步。 二值信号量主要用于任务的同步。本文例子使用STM32CubeMX 配置创建两个任务,一个任务每秒钟发送一次信号量,另一个等待信号量并控制LED 的输出状态。 Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103RBTx。 Step2.配置时钟引脚。 Step3.配置PA8 和PD2 为 Output,并把用户标签分别改为 LED0,LED1。 Step4.将系统时基源改为TIM4。 Step5.使能 FreeRTOS。 Step6.配置时钟树。8M 输入时,通过 PLL 得到 72M 内部时钟。 Step7.配置 FreeRTOS。 在Tasks and Queues 选项卡中,默认配置了一个名为defaultTask 的任务,其优先级为普通,任务堆栈大小为128 字,任务函数名为StartDefaultTask。 双击蓝色的地方,弹出对话框,将任务名修改为Periodic,将任务函数名修改为PeriodicTask。 点击Add 按钮,增加一个任务Handle,优先级设置为Normal,函数名为HandleTask。 在Timers and Semaphores 选项卡,点击Binary Semaphores 项右边的“Add”按钮,添加一个信号量,名称改为bSem01。 注:该步骤中,除了添加任务和信号量,其他的都使用默认参数。 Step8.生成代码。 等完成后直接打开工程。 工程基本组织结构如下图,其中Application/User 组中的文件是用户可以修改的,而其他组中的文件一般不进行修改。 Step9.分析程序结构。 在进入 main 函数之前,先定义了几个变量,声明了几个函数。 再看 main 函数。将 main 函数整理,删除很多注释之后,得到下图所示内容。 其中第①部分,是硬件配置;第②部分,创建一个信号量和两个任务;第③部分,启动调度器。 启动调度器后,程序就由 FreeRTOS 的调度器管理了,后面的 while(1)是不会执行到的。 Step10.添加代码。 在 main.c 文件中,找到前面配置添加的两个任务函数,并在其中分别添加代码。 PeriodicTask 的功能是,每 1 秒钟发送一次信号量。 HandleTask 的功能的,等待信号量,然后翻转 LED0 和 LED1 的输出状态。 Step11.编译下载运行。LED0 和 LED1 分别闪烁,周期都是 2 秒。 程序分析: 1.分析语句:osSemaphoreDef(bSem01); 和 osThreadDef(…)类似,osSemaphoreDef(…)并不是一个函数,而是一个宏。 其...