https://www.osrtos.com/rtos/uc-os-ii/
这里仅对已经建立好的工程模版进行说明,可以以此工程模版运行自己的任务。如果是基于HAL工程那么在STM32CubeMX配置工程时,可以选择使用
FREERTOS
系统。
void Test_Task (void *pdata)
{
~任务初始化代码~
While(1)//死循环
{ 任务 Test_Task 实体代码;
OSTimeDlyHMSM(x,x,x,x);//调用任务延时函数:时 分 秒 毫秒 (任务轮询时间)释放 cpu 控制权,
}
}
INT8U OSTaskSuspend (INT8U prio);
//在ucos_ii.h 文件中。https://doc.micrium.com/display/osiiidoc/OSTaskSuspend+routine
INT8U OSTaskResume (INT8U prio);
https://doc.micrium.com/display/osiiidoc/OSTaskResume+routine
INT8U OSTaskDel (INT8U prio);//删除指定优先级的任务函数
INT8U OSTaskDelReq (INT8U prio);//请求任务删除函数
INT8U OSTaskDel (INT8U prio);//删除指定优先级的任务函数
https://doc.micrium.com/display/osiiidoc/OSTaskDel+routine
INT8U OSTaskDelReq (INT8U prio);
https://doc.micrium.com/display/osiiidoc/OSTaskDel+routine
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"
#include "led.h"
//START 任务
//设置任务优先级
#define START_TASK_PRIO 10 ///开始任务的优先级为最低
#define START_STK_SIZE 512 //设置任务堆栈大小
OS_STK START_TASK_STK[START_STK_SIZE]; //任务任务堆栈
void start_task(void *pdata); //任务函数
//LED1任务
#define LED1_TASK_PRIO 4 //设置任务优先级
#define LED1_STK_SIZE 512 //设置任务堆栈大小
OS_STK LED1_TASK_STK[LED1_STK_SIZE]; //任务堆栈
void LED1_task(void *pdata); //任务函数
//LED2任务
#define LED2_TASK_PRIO 5 //设置任务优先级
#define LED2_STK_SIZE 256 //设置任务堆栈大小
OS_STK LED2_TASK_STK[LED2_STK_SIZE]; //任务堆栈
void LED2_task(void *pdata); //任务函数
int main(void)
{
delay_init(); //延时初始化
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
uart_init(115200); //串口波特率设置
OSInit(); //UCOS初始化
OSTaskCreate(start_task,
(void *)0,
(OS_STK *)&START_TASK_STK[START_STK_SIZE - 1],
START_TASK_PRIO
); //创建开始任务
OSStart(); //开始任务
}
//开始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr = 0;
pdata = pdata;
OSStatInit(); //开启统计任务
OS_ENTER_CRITICAL(); //进入临界区(关闭中断)
OSTaskCreate(LED1_task, (void *)0, (OS_STK *)&LED1_TASK_STK[LED1_STK_SIZE - 1], LED1_TASK_PRIO); //创建LED0任务
OSTaskCreate(LED2_task, (void *)0, (OS_STK *)&LED2_TASK_STK[LED2_STK_SIZE - 1], LED2_TASK_PRIO); //创建LED1任务
OSTaskSuspend(START_TASK_PRIO);//挂起开始任务
OS_EXIT_CRITICAL(); //退出临界区(开中断)
}
//LED1任务
void LED1_task(void *pdata)
{
OS_CPU_SR cpu_sr = 0;
OS_ENTER_CRITICAL(); //进入临界区(关闭中断)
// 这里放置初始化任务
LED_Init();
OS_EXIT_CRITICAL(); //退出临界区(开中断)
while (1)
{
GPIO_SetBits(GPIOE, GPIO_Pin_5);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
printf("Task1! \r\n");
OSTimeDlyHMSM(0, 0, 1, 0); //时 分 秒 毫秒 (任务轮询时间)
}
}
//LED2任务
void LED2_task(void *pdata)
{
OS_CPU_SR cpu_sr = 0;
OS_ENTER_CRITICAL(); //进入临界区(关闭中断)
OS_EXIT_CRITICAL(); //退出临界区(开中断)
while (1)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);
GPIO_ResetBits(GPIOE, GPIO_Pin_5);
printf("Task2! \r\n");
OSTimeDlyHMSM(0, 0, 2, 0); //时 分 秒 毫秒 (任务轮询时间)
}
}
链接: https://pan.baidu.com/s/1TnA1VjkOJJ5VlbdupFRF_w
提取码: vn7z