W800/W801学习记录FreeRTOS操作系统部分(一):任务系统_w801 freertos-程序员宅基地

技术标签: W801  物联网  单片机  


前言

在官方提供的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;
}

四、进群讨论分享!

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_50622833/article/details/123500269

智能推荐

iOS 获取URL链接中的各参数_ios 获取url参数-程序员宅基地

文章浏览阅读5.1k次。1、iOS请求URL中含有中文怎么办?使用UTF-8编码一下就OK了NSString* encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];2、iOS获取URL链接中的各个参数值:例:http://example.com?param1=value1&param2=param2通过对一个合法的url(第一个参数用"?“连接,且url中只有一个”?",剩下的参数用_ios 获取url参数

R语言|while循环————R语言入门到入土系列(九)_r语言while循环-程序员宅基地

文章浏览阅读6k次,点赞3次,收藏16次。本文介绍了R语言while循环的写法,并以连加1到1000为例简单介绍用法_r语言while循环

pycallgraph 安装失败,一直报subprocess-exited-with-error_setuptools降级-程序员宅基地

文章浏览阅读5.2k次,点赞17次,收藏11次。两个方式安装pycallgraph均报subprocess-exited-with-error异常_setuptools降级

POJ 2299 Ultra-QuickSort-程序员宅基地

文章浏览阅读708次。Ultra-QuickSortTime Limit: 7000MSMemory Limit: 65536KTotal Submissions: 51274Accepted: 18803DescriptionIn this problem, you have to analyze a particular sorting algorithm. The algori

「网站架构」前端模块化的工作原理和各种方法的分析及应用场景?_网站架构 如何实现多模块部署-程序员宅基地

文章浏览阅读598次。本期我们来聊一聊前端页面模块化, 模块化也是《前端架构需要解决的问题》中最后一个还没介绍的问题 ,也是前端架构问题中最为复杂的问题。模块化的目的,是为了降低整体项目的工作量 也就是说页面中的部分内容是可以复用的。模块化虽然看起来很美好, 但用不好的话,反而会变成累赘 。而且,现在的模块化方案其实还有很大的改进空间。我们讨论以下几个问题1、模块化的原则是什么2、现有的模块化方案3、现今模块化的困境与我们的解决方案1、模块化原则首先,我们先讨论模块化的原则, 模块..._网站架构 如何实现多模块部署

c++求矩阵的秩_对于向量和矩阵的理解-程序员宅基地

文章浏览阅读316次。学数值计算还有复变函数了喔,矩阵忘干净了。又看了一遍 蓝棕 的相关的讲解,总结一下。1.向量是什么?从初到末的箭头(物理角度,表示一种运动过程)有序的数字列表(计算机/数学角度)[1,2]加和数乘运算有意义的anything(抽象意义)12两种理解之间的关系就是线性代数的奥秘,即几何角度与数值角度。一个向量的坐标由一对数构成,可以理解为从原点到终点的箭头,描述运动过程。比如,规定好坐标平面的单位,..._求矩阵的秩c++

随便推点

卷积神经网络实现图像识别_picture_predictions.model_predictions import netwo-程序员宅基地

文章浏览阅读1.8w次,点赞57次,收藏543次。项目简介目的: 实现昆虫的图像分类,同时该模型也可以用于其他图像的分类识别,只需传入相应的训练集进行训练,保存为另一个模型即可,进行调用使用。配置环境: pycharm(python3.7),导入pytotch库知识预备: 需要了解卷积神经网络的基本原理与结构,熟悉pytorch的使用,csdn有很多介绍卷积神经网络的文章,可查阅。算法设计思路:(1) 收集数据集,利用 python 的 requests 库和 bs4 进行网络爬虫,下载数据集(2) 搭建卷积神经网络(3)对卷积神经网络进行训_picture_predictions.model_predictions import network_bn

LoRa技术特点_物联网lora信号的带宽-程序员宅基地

文章浏览阅读2.1k次。LoRa简介LoRa是由Semtech公司提供的超长距离、低功耗的物联 网解决方案。Semtech公司和多家业界领先的企业,如Cisco、 IBM及Microchip发起建立了LoRa(Long Range,广距)联 盟,致力于推广其联盟标准LoRaWAN技术,以满足各种需要 广域覆盖和低功耗的M2M设备应用要求。LoRaWAN目前已 有成员150多家,也有数家中国公司参与其中,并且在欧洲数 个国家进行了商业部署,国内也开始有了应用。LoRa技术特点LoRa的物理层和MAC层设计充分体现其对Io_物联网lora信号的带宽

ubuntu更新git版本-程序员宅基地

文章浏览阅读3.2k次,点赞7次,收藏7次。直接通过sudo apt install git命令安装的git是ubuntu主仓库中的一个较低的版本,如果想要一个ubuntu上支持的最新稳定版本,需要通过PPA来获得。 添加PPA仓库到系统中: sudo add-apt-repository ppa:git-core/ppa 更新同步信息: sudo apt-get update 更新git版本: sudo apt install git..._ubuntu更新git版本

vue3入门(学习之路一)-程序员宅基地

文章浏览阅读1.3k次。1、vue3变化 新增了三个组件:Fragment 支持多个根节点、Suspense 可以在组件渲染之前的等待时间显示指定内容、Teleport 可以让子组件能够在视觉上跳出父组件(如父组件overflow:hidden)。 新增指令 v-memo,可以缓存 html 模板,比如 v-for 列表不会变化的就缓存,简单说就是用内存换时间。 新增 Composition API 可以更好的逻辑复用和代码组织,同一功能的代码不至于像以前一样太分散,虽然 Vue2 中可以用 minxin

送一款巧克力式绝美键盘!真香!-程序员宅基地

文章浏览阅读130次。赠送规则本次活动联合了10个优质号主,送出 7台适合程序员的巧克力键盘,选择巧克力,是因为即将到来的5.1节。进入下面每个公众号主页回复 562获得一张 助力券,扫描参与抽奖。每扫描..._程序员 巧克力键盘

Qt开发:Qt Widgets模块——QAction类_qwidgetaction-程序员宅基地

文章浏览阅读1.7w次,点赞5次,收藏34次。QAction类提供了可以插入到窗口小部件中的抽象用户界面操作。头文件:#include <QAction> qmake:QT += widgets继承:QObject被继承:QWidgetAction在应用程序中,可以通过菜单,工具栏按钮和键盘快捷键调用许多常用命令。 由于用户期望每个命令都以相同的方式执行,无论使用的用户界面如何,将每个命令表示为一个操作都很有用。操作可以添加到菜单..._qwidgetaction

推荐文章

热门文章

相关标签