【STM32】基于标准库下的UCOSII系统工程模版

【STM32】基于标准库下的UCOSII系统工程模版


  • ✨如果想了解UCOSII系统可以前往官网:https://www.osrtos.com/rtos/uc-os-ii/
  • 如果你想自己从源码中移植可以参考《UCOSII系统移植详解》

这里仅对已经建立好的工程模版进行说明,可以以此工程模版运行自己的任务。如果是基于HAL工程那么在STM32CubeMX配置工程时,可以选择使用FREERTOS系统。

创建任务介绍

  1. 设置任务优先级。
  2. 设置任务堆栈大小。
  3. 创建任务函数。
任务函数主体
void Test_Task (void *pdata)
{
~任务初始化代码~
While(1)//死循环
{ 任务 Test_Task 实体代码;
OSTimeDlyHMSM(x,x,x,x);//调用任务延时函数:时 分 秒 毫秒 (任务轮询时间)释放 cpu 控制权,
}
 }

任务挂起函数

  • INT8U OSTaskSuspend (INT8U prio);//在ucos_ii.h 文件中。
    • 参数说明:
      INT8U prio:任务的优先级。
      返回值说明:
      如果成功地挂起了任务,该函数返回 OS_ERR_NONE(0)。
      如果指定的任务不存在,该函数返回 OS_ERR_TASK_NOT_EXIST。
      如果指定的任务未激活,该函数返回 OS_ERR_TASK_SUSPENDED。
      如果当前的任务优先级比指定任务的优先级更高,该函数返回 OS_ERR_TASK_RESUME_PRIO。
  • 完整的使用示例请参考源代码 :https://doc.micrium.com/display/osiiidoc/OSTaskSuspend+routine

任务恢复函数

INT8U  OSTaskResume  (INT8U  prio);
    • 参数说明
      INT8U prio:任务的优先级。
      返回值说明
      如果成功地恢复了目标任务,返回 OS_ERR_NONE(0)。
      如果要恢复的任务不存在,则返回 OS_ERR_TASK_NOT_EXIST。
      如果要恢复的任务已经处于运行状态,则返回 OS_ERR_TASK_NOT_SUSPENDED。
      如果当前任务优先级比目标任务的优先级更高,则返回 OS_ERR_TASK_RESUME_PRIO。
  • 完整的使用示例请参考源代码: https://doc.micrium.com/display/osiiidoc/OSTaskResume+routine

任务删除函数以及请求任务删除函数

INT8U OSTaskDel   (INT8U  prio);//删除指定优先级的任务函数
INT8U OSTaskDelReq (INT8U  prio);//请求任务删除函数

  • INT8U OSTaskDel (INT8U prio);//删除指定优先级的任务函数
    • 参数说明:
      INT8U prio:要删除的任务的优先级。
      注意事项
      如果你想要删除当前的任务,可以将参数 prio 设为当前任务的优先级。
      该函数会删除指定的任务的 TCB(任务控制块)和堆栈,回收它们所占用的内存资源。
      删除自身的任务应该调用 OSTaskDel(),并将参数 prio 设置为当前任务的优先级,即删除当前任务。
  • 详细的使用示例请参考源代码: https://doc.micrium.com/display/osiiidoc/OSTaskDel+routine
  • INT8U OSTaskDelReq (INT8U prio);
    • 参数说明:
      INT8U prio:要删除的任务的优先级。
      注意事项
      如果你想要删除当前的任务,可以将参数 prio 设为当前任务的优先级。
      该函数会删除指定的任务的 TCB(任务控制块)和堆栈,回收它们所占用的内存资源。
      删除自身的任务应该调用 OSTaskDel(),并将参数 prio 设置为当前任务的优先级,即删除当前任务。
  • 详细的使用示例请参考源代码: https://doc.micrium.com/display/osiiidoc/OSTaskDel+routine

STM32 UCOSII 任务示例代码

#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); //时 分 秒 毫秒 (任务轮询时间)
    }
}



基于标准库下的UCOSII系统工程模版

  • ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!

链接: https://pan.baidu.com/s/1TnA1VjkOJJ5VlbdupFRF_w
提取码: vn7z

你可能感兴趣的:(stm32,UCOSII)