FreeRTOS知识及常用API函数(更新中)_freertos中断触发函数-程序员宅基地

技术标签: STM32与GD32  stm32  FreeRTOS  嵌入式硬件  单片机  

目录

1、简介

2、特点

3、三种任务调度方式

3.1 抢占式调度:

3.2 时间片调度:

3.3 协程式调度:

4、任务状态

5、常用API接口函数

1. 创建一个任务xTaskCreate()

2. 删除一个任务vTaskDelete()

3. 挂起任务vTaskSuspend()

4. 恢复被挂起任务vTaskResume()

5. 中断中恢复被挂起任务vTaskResumeFromISR()

6. 获取任务的状态eTaskGetState()

7. 任务中进入退出临界区

8. 中断中进入退出临界区

9. 关闭中断portDISABLE_INTERRUPTS()

10. 打开中断portENABLE_INTERRUPTS()


1、简介

        RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性,例如打游戏和回复信息,不需要等某一件事做完,可每间隔1ms(一个时间片时钟节拍),然后交替做这两件 事,因为速度很快,从宏观的意义上来看,类似同步执行!

2、特点

        其有以下特点:①实现功能划分为多个任务;②延时函数不会空等待,会让出CPU的使用权给其他任务,即任务调度;③高优先级任务抢占低优先级任务;④每个任务都有自己的栈空间,用于保存局部变量以及任务的上下文信息。

3、三种任务调度方式

   3.1 抢占式调度:

        针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。

   3.2 时间片调度:

        针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务。

   3.3 协程式调度:

        当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务(不建议使用,因为官方已停止更新)。

4、任务状态

FreeRTOS中任务共存在4种状态:①运行态:正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态;②就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态;③阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态;④挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume() 才可以进入就绪态。

        仅就绪态可转变成运行态,其他状态的任务想运行,必须先转变成就绪态。

5、常用API接口函数

        注意:以下表格中的函数和参数信息是基于 FreeRTOS 版本 10.x 的情况,具体的版本可能会有差异。在使用这些函数时,请根据你所使用的 FreeRTOS 版本和相关文档进行确认。

    1. 创建一个任务xTaskCreate()

osThreadStaticDef(myTask02, StartTask02, osPriorityNormal, 0, 128, myTask02Buffer, &myTask02ControlBlock);
myTask02Handle = xTaskCreate(osThread(myTask02), NULL);

    2. 删除一个任务vTaskDelete()

//删除另外的任务
if(myTask02Handle != NULL){
    vTaskDelete(myTask02Handle);    //要删除的任务句柄
    myTask02Handle=NULL;            //清空
}


//删除本身任务
vTaskDelete(NULL);
myTask03Handle=NULL;

    3. 挂起任务vTaskSuspend()

//挂起另外的任务
vTaskSuspend(myTask02Handle);

//挂起当前任务
vTaskSuspend(NULL);    

    4. 恢复被挂起任务vTaskResume()

vTaskResume(myTask02Handle);

    5. 中断中恢复被挂起任务vTaskResumeFromISR()

//注意:必须是单片机的中断回调函数中运行该API函数
//注意:该EXTI中断优先级不能大于某一个设置的阈值优先级

//例如EXTI端口触发中断回调函数
void HAL_EXTI_Callback(uint16_t GPIO_Pin){

    if(GPIO_Pin==GPIO_PIN_9) {//判断哪个引脚触发外部中断

        BaseType_t xYieldRequired;
        xYieldRequired = vTaskResumeFromISR(myTask02Handle);//中断中恢复挂起任务

        if(xYieldRequired == pdTRUE){//判断任务恢复后,是否需要进行任务切换
            portYIELD_FROM_ISR(xYieldRequired );//任务切换
        }

    }
}

    6. 获取任务的状态eTaskGetState()

/* 
    *eRunning: 运行态
    *eReady  : 就绪态
    *eBlocked: 阻塞态
    *eSuspended: 挂起态
    *eDeleted: 已被删除
    *eInvalid: 无效态
*/

//判断是否挂起态,挂起则恢复任务
if(eTaskGetState(myTask02Handle) == eSuspended){
    vTaskResume(myTask02Handle);
}

    7. 获取任务的优先级uxTaskPriorityGet()

使用该函数需将宏 INCLUDE_uxTaskPriorityGet 置 1 。

UBaseType_t priority_num = 0;

priority_num = uxTaskPriorityGet( NULL );//获取自身任务优先级

priority_num = uxTaskPriorityGet(myTask02Handle);//获取myTask02Handle句柄任务优先级

    8. 设置任务的优先级vTaskPrioritySet() 

使用该函数需将宏 INCLUDE_vTaskPrioritySet 置 1 。

vTaskPrioritySet( myTask02Handle, 4);//设置myTask02Handle句柄任务优先级为4

    9. 获取系统中任务数量uxTaskGetNumberOfTasks() 

        RTOS 内核当前正在管理的任务数。这包括所有准备就绪、阻塞和挂起的任务。已删除但尚未被闲置任务释放的任务也将包含在计数中。

UBaseType_t num = 0 ;

num = uxTaskGetNumberOfTasks();

    8. 任务中进入退出临界区

vtaskENTER_CRITICAL();    //进入临界区后,不会被别的高优先级任务而打断该任务

......
......    //可以做别的操作,而不被高优先级任务打断
......

vtaskEXIT_CRITICAL();    //退出临界区,别的高优先级任务就会打断这个任务

    9. 中断中进入退出临界区

//注意:必须是单片机的中断回调函数中运行该API函数
//注意:该EXTI中断优先级不能大于某一个设置的阈值优先级


uint32_t save_status;


//例如EXTI端口触发中断回调函数
void HAL_EXTI_Callback(uint16_t GPIO_Pin){

    if(GPIO_Pin==GPIO_PIN_9) {//判断哪个引脚触发外部中断

       save_status = vtaskENTER_CRITICAL_FROM_ISR();    //中断级"进入"临界区

    }
}


//另外的函数中
vtaskEXIT_CRITICAL_FROM_ISR(save_status);    //中断级"退出"临界区

    10. 关闭中断portDISABLE_INTERRUPTS()

portDISABLE_INTERRUPTS();    //屏蔽优先级低于某一个阈值的中断

    11. 打开中断portENABLE_INTERRUPTS()

portENABLE_INTERRUPTS();    //打开优先级低于某一个阈值的中断
vTaskDelay 延时任务执行 vTaskDelay(xTicksToDelay)

延时的时钟节拍数

xSemaphoreCreateBinary

创建二值信号量 xSemaphoreCreateBinary(xQueue) 信号量句柄
xQueueCreate 创建一个队列 xQueueCreate(uxQueueLength, uxItemSize) 队列长度、队列项大小
xQueueSend 发送数据到队列 xQueueSend(xQueue, pvItemToQueue, xTicksToWait) 队列句柄、要发送的数据指针、等待时间
xQueueReceive 从队列接收数据 xQueueReceive(xQueue, pvBuffer, xTicksToWait) 队列句柄、接收缓冲区指针、等待时间
xEventGroupCreate 创建事件组 xEventGroupCreate()
xEventGroupSetBits 设置事件组中的位 xEventGroupSetBits(xEventGroup, uxBitsToSet) 事件组句柄、要设置的位
xEventGroupWaitBits 等待事件组中的位 xEventGroupWaitBits(xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait) 事件组句柄、等待的位、退出时是否清除、是否等待所有位、等待时间
xTimerCreate 创建一个定时器 xTimerCreate(pcTimerName, xTimerPeriod, uxAutoReload, pvTimerID, pxCallbackFunction) 定时器名称、定时周期、是否自动重载、定时器ID、回调函数指针
xTimerStart 启动定时器 xTimerStart(xTimer, xTicksToWait) 定时器句柄、等待时间
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26043945/article/details/132595135

智能推荐

linux里面ping www.baidu.com ping不通的问题_linux桥接ping不通baidu-程序员宅基地

文章浏览阅读3.2w次,点赞16次,收藏90次。对于这个问题我也是从网上找了很久,终于解决了这个问题。首先遇到这个问题,应该确认虚拟机能不能正常的上网,就需要ping 网关,如果能ping通说明能正常上网,不过首先要用命令route -n来查看自己的网关,如下图:第一行就是默认网关。现在用命令ping 192.168.1.1来看一下结果:然后可以看一下电脑上面百度的ip是多少可以在linux里面ping 这个IP,结果如下:..._linux桥接ping不通baidu

android 横幅弹出权限,有关 android studio notification 横幅弹出的功能没有反应-程序员宅基地

文章浏览阅读512次。小妹在这里已经卡了2-3天了,研究了很多人的文章,除了低版本api 17有成功外,其他的不是channel null 就是没反应 (channel null已解决)拜托各位大大,帮小妹一下,以下是我的程式跟 gradle, 我在这里卡好久又没有人可问(哭)![image](/img/bVcL0Qo)public class MainActivity extends AppCompatActivit..._android 权限申请弹窗 横屏

CNN中padding参数分类_cnn “相同填充”(same padding)-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏6次。valid padding(有效填充):完全不使用填充。half/same padding(半填充/相同填充):保证输入和输出的feature map尺寸相同。full padding(全填充):在卷积操作过程中,每个像素在每个方向上被访问的次数相同。arbitrary padding(任意填充):人为设定填充。..._cnn “相同填充”(same padding)

Maven的基础知识,java技术栈-程序员宅基地

文章浏览阅读790次,点赞29次,收藏28次。手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长![外链图片转存中…(img-Qpoc4gOu-1712656009273)][外链图片转存中…(img-bSWbNeGN-1712656009274)]

getFullYear()和getYear()有什么区别_getyear和getfullyear-程序员宅基地

文章浏览阅读469次。Date对象取得年份有getYear和getFullYear两种方法经 测试var d=new Date;alert(d.getYear())在IE中返回 2009,在Firefox中会返回109。经查询手册,getYear在Firefox下返回的是距1900年1月1日的年份,这是一个过时而不被推荐的方法。而alert(d.getFullYear())在IE和FF中都会返回2009。因此,无论何时都应使用getFullYear来替代getYear方法。例如:2016年用 getFullYea_getyear和getfullyear

Unix传奇 (上篇)_unix传奇pdf-程序员宅基地

文章浏览阅读182次。Unix传奇(上篇) 陈皓 了解过去,我们才能知其然,更知所以然。总结过去,我们才会知道我们明天该如何去规划,该如何去走。在时间的滚轮中,许许多的东西就像流星一样一闪而逝,而有些东西却能经受着时间的考验散发着经久的魅力,让人津津乐道,流传至今。要知道明天怎么去选择,怎么去做,不是盲目地跟从今天各种各样琳琅满目前沿技术,而应该是去 —— 认认真真地了解和回顾历史。 Unix是目前还在存活的操作系_unix传奇pdf

随便推点

ACwing 哈希算法入门:_ac算法 哈希-程序员宅基地

文章浏览阅读308次。哈希算法:将字符串映射为数字形式,十分巧妙,一般运用为进制数,进制据前人经验,一般为131,1331时重复率很低,由于字符串的数字和会很大,所以一般为了方便,一般定义为unsigned long long,爆掉时,即为对 2^64 取模,可以对于任意子序列的值进行映射为数字进而进行判断入门题目链接:AC代码:#include<bits/stdc++.h>using na..._ac算法 哈希

VS配置Qt和MySQL_在vs中 如何装qt5sqlmysql模块-程序员宅基地

文章浏览阅读952次,点赞13次,收藏27次。由于觉得Qt的编辑界面比较丑,所以想用vs2022的编辑器写Qt加MySQL的项目。_在vs中 如何装qt5sqlmysql模块

【渝粤题库】广东开放大学 互联网营销 形成性考核_画中画广告之所以能有较高的点击率,主要由于它具有以下特点-程序员宅基地

文章浏览阅读1k次。选择题题目:下面的哪个调研内容属于经济环境调研?()题目:()的目的就是加强与客户的沟通,它是是网络媒体也是网络营销的最重要特性。题目:4Ps策略中4P是指产品、价格、顾客和促销。题目:网络市场调研是目前最为先进的市场调研手段,没有任何的缺点或不足之处。题目:市场定位的基本参数有题目:市场需求调研可以掌握()等信息。题目:在开展企业网站建设时应做好以下哪几个工作。()题目:对企业网站首页的优化中,一定要注意下面哪几个方面的优化。()题目:()的主要作用是增进顾客关系,提供顾客服务,提升企业_画中画广告之所以能有较高的点击率,主要由于它具有以下特点

爬虫学习(1):urlopen库使用_urlopen the read operation timed out-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏5次。以爬取CSDN为例子:第一步:导入请求库第二步:打开请求网址第三步:打印源码import urllib.requestresponse=urllib.request.urlopen("https://www.csdn.net/?spm=1011.2124.3001.5359")print(response.read().decode('utf-8'))结果大概就是这个样子:好的,继续,看看打印的是什么类型的:import urllib.requestresponse=urllib.r_urlopen the read operation timed out

分享读取各大主流邮箱通讯录(联系人)、MSN好友列表的的功能【升级版(3.0)】-程序员宅基地

文章浏览阅读304次。修正sina.com/sina.cn邮箱获取不到联系人,并精简修改了其他邮箱代码,以下就是升级版版本的介绍:完整版本,整合了包括读取邮箱通讯录、MSN好友列表的的功能,目前读取邮箱通讯录支持如下邮箱:gmail(Y)、hotmail(Y)、 live(Y)、tom(Y)、yahoo(Y)(有点慢)、 sina(Y)、163(Y)、126(Y)、yeah(Y)、sohu(Y) 读取后可以发送邮件(完..._通讯录 应用读取 邮件 的相关

云计算及虚拟化教程_云计算与虚拟化技术 教改-程序员宅基地

文章浏览阅读213次。云计算及虚拟化教程学习云计算、虚拟化和计算机网络的基本概念。此视频教程共2.0小时,中英双语字幕,画质清晰无水印,源码附件全课程英文名:Cloud Computing and Virtualization An Introduction百度网盘地址:https://pan.baidu.com/s/1lrak60XOGEqMOI6lXYf6TQ?pwd=ns0j课程介绍:https://www.aihorizon.cn/72云计算:概念、定义、云类型和服务部署模型。虚拟化的概念使用 Type-2 Hyperv_云计算与虚拟化技术 教改