基于提供的uCOS-II基础工程代码,添加信号量/邮箱/消息功能,使开发板开机后led1 熄灭,led0闪烁10次后熄灭,led1接着闪烁10次后熄灭,再接下来led0闪烁,如此反复。基于以下代码修改:
时间: 2024-03-19 13:44:42 浏览: 59
好的,根据您的要求,可以在uCOS-II基础工程代码中添加信号量和邮箱功能来实现LED灯的闪烁。以下是基于提供的代码所做的修改:
1. 在main.c中添加头文件和宏定义
```c
#include "includes.h" // 包含uCOS-II的头文件
#include "app_cfg.h" // 包含任务优先级等定义
#include "stm32f10x.h" // 包含STM32芯片的头文件
#define LED0_ON() GPIO_ResetBits(GPIOB,GPIO_Pin_5) // 定义LED0亮的宏
#define LED0_OFF() GPIO_SetBits(GPIOB,GPIO_Pin_5) // 定义LED0灭的宏
#define LED1_ON() GPIO_ResetBits(GPIOB,GPIO_Pin_0) // 定义LED1亮的宏
#define LED1_OFF() GPIO_SetBits(GPIOB,GPIO_Pin_0) // 定义LED1灭的宏
```
2. 在main.c中添加任务函数
```c
// 定义任务堆栈大小
#define TASK_STK_SIZE 128
// 定义任务堆栈空间
OS_STK Task0Stk[TASK_STK_SIZE];
OS_STK Task1Stk[TASK_STK_SIZE];
// 定义任务优先级
#define TASK0_PRIO 6
#define TASK1_PRIO 7
// 定义任务间的信号量和邮箱
OS_EVENT *sem;
OS_EVENT *mbox;
// 任务0:LED0闪烁
void Task0(void *pdata)
{
OS_CPU_SR cpu_sr = 0;
INT8U err;
INT16U led0_count = 0;
while(1)
{
OS_ENTER_CRITICAL(); // 进入临界区
LED0_ON(); // LED0亮
OSTimeDlyHMSM(0, 0, 0, 500); // 延时500毫秒
LED0_OFF(); // LED0灭
OSTimeDlyHMSM(0, 0, 0, 500); // 延时500毫秒
OS_EXIT_CRITICAL(); // 退出临界区
if(++led0_count >= 10) // LED0闪烁10次后发送消息给任务1
{
err = OSMboxPost(mbox, (void *)&led0_count); // 发送消息
led0_count = 0; // 重置计数器
if(err != OS_ERR_NONE) // 发送失败
{
// 处理发送失败的情况
}
}
}
}
// 任务1:LED1闪烁
void Task1(void *pdata)
{
OS_CPU_SR cpu_sr = 0;
INT8U err;
INT16U led1_count = 0;
INT16U *p_msg;
while(1)
{
p_msg = (INT16U *)OSMboxPend(mbox, 0, &err); // 等待消息
if(err != OS_ERR_NONE) // 接收失败
{
// 处理接收失败的情况
}
led1_count = *p_msg;
while(led1_count--) // LED1闪烁led1_count次
{
OS_ENTER_CRITICAL(); // 进入临界区
LED1_ON(); // LED1亮
OSTimeDlyHMSM(0, 0, 0, 500); // 延时500毫秒
LED1_OFF(); // LED1灭
OSTimeDlyHMSM(0, 0, 0, 500); // 延时500毫秒
OS_EXIT_CRITICAL(); // 退出临界区
}
err = OSSemPost(sem); // 发送信号量
if(err != OS_ERR_NONE) // 发送失败
{
// 处理发送失败的情况
}
}
}
```
3. 在main函数中初始化并启动任务、信号量和邮箱
```c
int main(void)
{
OS_CPU_SR cpu_sr = 0;
INT8U err;
// 初始化uCOS-II
OSInit();
// 创建任务0
OSTaskCreate(Task0, NULL, &Task0Stk[TASK_STK_SIZE - 1], TASK0_PRIO);
// 创建任务1
OSTaskCreate(Task1, NULL, &Task1Stk[TASK_STK_SIZE - 1], TASK1_PRIO);
// 创建信号量
sem = OSSemCreate(0);
if(sem == NULL) // 创建失败
{
// 处理创建失败的情况
}
// 创建邮箱
mbox = OSMboxCreate(NULL);
if(mbox == NULL) // 创建失败
{
// 处理创建失败的情况
}
// 启动uCOS-II多任务调度
OSStart();
while (1)
{
}
}
```
4. 修改stm32f10x_it.c文件中的SysTick_Handler函数
```c
void SysTick_Handler(void)
{
OS_CPU_SR cpu_sr = 0;
OSIntEnter(); // 进入uCOS-II中断处理
OSTimeTick(); // 计时器加1
OSIntExit(); // 退出uCOS-II中断处理
}
```
完成以上修改后,重新编译并下载到开发板中,即可看到LED0闪烁10次后,LED1闪烁10次,然后再接着LED0闪烁,如此反复。
阅读全文