> 文档中心 > W800/W801学习记录FreeRTOS操作系统部分(一):任务系统

W800/W801学习记录FreeRTOS操作系统部分(一):任务系统

文章目录

  • 前言
  • 一、启动方式
  • 二、任务创建与删除
    • 1.任务创建函数
    • 2.任务删除函数
    • 3.获取当前运行任务句柄
    • 4.任务创建与删除演示
  • 三、任务状态
    • 1.任务运行状态
    • 2.挂起函数
    • 3.延时函数
    • 4.恢复挂起的任务
  • 四、进群讨论分享!

前言

在官方提供的SDK中,使用的是FreeRTOS实时操作系统。但使用时和一般的FreeRTOS不同,因为它对一些函数进行了改造,直白点来说就是披上了一层皮。本章对SDK中的FreeRTOS的任务系统进行阐述和解析。

一、启动方式

W800/W801学习记录FreeRTOS操作系统部分(一):任务系统
在上图可以看到,芯片在上电后运行启动文件,然后进行初始化。用户在main.c的void UserMain(void)函数里面编写自己的程序。

二、任务创建与删除

1.任务创建函数

tls_os_status_t tls_os_task_create(tls_os_task_t *task, //任务句柄      const char* name,    //名称      void (*entry)(void* param), //任务函数入口      void* param,  //函数参数      u8 *stk_start,//堆栈开始地址      u32 stk_size, //堆栈大小      u32 prio,     //优先级      u32 flag);    //包含任务的额外信息

如果有兴趣研究的话,可以查看函数的描述。可以见到上述函数调用的是FreeRTOS的xTaskGenericCreate函数。但由于篇幅原因不在这里展开。

2.任务删除函数

    //handle      任务函数句柄    //(*freefun)(void)   释放资源函数入口tls_os_status_t tls_os_task_del_by_task_handle(void *handle, void (*freefun)(void));

函数的第二个参数是另一个函数的入口,此函数用于删除任务后释放资源,也可不用。

3.获取当前运行任务句柄

tls_os_task_t tls_os_task_id(){   return (tls_os_task_t)xTaskGetCurrentTaskHandle(); }

4.任务创建与删除演示

#include  "wm_include.h"#define    MY_TASK_SIZE      1024      //堆栈区大小static     OS_STK MyTaskStk[MY_TASK_SIZE];  //创建堆栈区u8 testNum = 0;void mytask(void *pvParam)     {u8 *prTestNum = (u8 *)pvParam;while(1){printf("\n testNum:%d \n",++(*prTestNum));tls_os_time_delay(1000);}} //任务函数void freefun(void){printf("\n free the resource \n");}      //删除任务后执行的函数,用于释放内存资源void UserMain(void){  printf("\n user main \n");  tls_os_task_t mytaskHandle = NULL;     //任务函数句柄  tls_os_task_create(&mytaskHandle,"mytask",mytask,(void *)&testNum,MyTaskStk, MY_TASK_SIZE * sizeof(u32),1,0);   //创建任务  tls_os_time_delay(5000); //延时  tls_os_task_del_by_task_handle(mytaskHandle,freefun);    //删除任务}

运行结果如下图:
在这里插入图片描述

三、任务状态

1.任务运行状态

在这里插入图片描述
FreeRtos的任务调度方式分抢占式和合作式,一般合作式比较少用,这里就不说了。四种状态之间可以相互转换,如上图所示。

FreeRtos的任务状态分四种,分别是:

  • 运行态:CPU正在执行的任务;
  • 就绪态:任务创建后,任务就处于就绪状态。如果就绪列表中的任务比运行态中的任务优先级高,则优先级高的任务会抢占CPU执行权;
  • 阻塞态:任务在等待某个信号量或者延时,释放CPU执行权;
  • 挂起:任务被挂起,不运行。

2.挂起函数

 tls_os_status_t tls_os_task_suspend(tls_os_task_t *task)  //参数为函数句柄{vTaskSuspend(task);return TLS_OS_SUCCESS;}

3.延时函数

使用延时函数后,交出CPU执行权,进入阻塞状态。任务延时结束后进入就绪状态

 void tls_os_time_delay(u32 ticks);  //ticks:延时时间片数

需要注意的是,函数参数ticks单位并非ms。需要在FreeRTOSConfig.h里面设置,默认为500Hz,即1个ticks数为2ms。若设置为1000,则延时1个ticsks为1ms。

#define configTICK_RATE_HZ( ( portTickType ) 500u )//时间片中断的频率

4.恢复挂起的任务

tls_os_status_t tls_os_task_resume(tls_os_task_t *task){vTaskResume(task);return TLS_OS_SUCCESS;}

四、进群讨论分享!

如果你喜欢我的文章,欢迎关注下方公众号,在公众号内回复“交流群”,进群一起讨论分享!
在这里插入图片描述