W800/W801学习记录FreeRTOS操作系统部分(一):任务系统
文章目录
- 前言
- 一、启动方式
- 二、任务创建与删除
- 三、任务状态
-
- 1.任务运行状态
- 2.挂起函数
- 3.延时函数
- 4.恢复挂起的任务
- 四、进群讨论分享!
前言
在官方提供的SDK中,使用的是FreeRTOS实时操作系统。但使用时和一般的FreeRTOS不同,因为它对一些函数进行了改造,直白点来说就是披上了一层皮。本章对SDK中的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;}
四、进群讨论分享!
如果你喜欢我的文章,欢迎关注下方公众号,在公众号内回复“交流群”,进群一起讨论分享!