FreeRTOS使用汇总
/**********创建任务**************/
TaskHandle_t Hardware_TaskHandle; //任务句柄,如果不用到消息,可不用句柄
void main (void)
{
MY_NVIC_PriorityGroupConfig(4);
delay_init(168);
xTaskCreate(startTask, "START_TASK", 300, NULL, 7, &startTaskHandle);
vTaskStartScheduler(); //开启调度
while(1)
{
vTaskDelay(100);
}
}
static void startTask(void *arg)
{
taskENTER_CRITICAL(); //进入临界区
xTaskCreate(Hardware_Task, "Hardware_init", 300, NULL, 6, &Hardware_TaskHandle);//硬件初始化
//xTaskCreate(Hardware_Task, "Hardware_init", 300, NULL, 6, NULL); //不用句柄
vTaskDelete(startTaskHandle); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
/**********队列**************/
#include "queue.h"
QueueHandle_t test_Queue; //定义
u8 test_send //需要发送的数据
BaseType_t xHigherPriorityTaskWoken; //中断需要
//队列项 每个队列项的字节数
test_Queue=xQueueCreate(2,1); //创建队列 2个项目,每个项目1个字节
//每次发送和接收一个项目
//任务级发送函数
xQueueSend(test_Queue,&test_send,portMAX_DELAY); //任务发送队列函数,发送消息到队尾
xQueueSendToFront(test_Queue,&test_send,portMAX_DELAY); //任务发送队列函数,发送消息到队头
xQueueOverwrite(test_Queue,&test_send); //任务发送队列函数,带覆写功能,应该是到队尾
//中断级发送函数
xQueueSendFromISR(test_Queue,&test_send,&xHigherPriorityTaskWoken); //中断队列发送函数,发送消息到队尾
xQueueSendToFrontFromISR(test_Queue,&test_send,&xHigherPriorityTaskWoken); //中断队列发送函数,发送消息到队头
xQueueOverwriteFromISR(test_Queue,&test_send,&xHigherPriorityTaskWoken); //带覆写功能,满了覆盖掉旧队列
//任务级读取函数
xQueueReceive(test_Queue,&test_queue,portMAX_DELAY); //任务读取队列函数,读完删掉队列项
xQueuePeek(test_Queue,&test_queue,portMAX_DELAY); //任务读取队列函数,读完不删掉
//中断级读取函数
xQueueReceiveFromISR(test_Queue,&test_queue,&xHigherPriorityTaskWoken); //读完删掉队列项
xQueuePeekFromISR(test_Queue,&test_queue); //读完不删除
//用法
if(test_Queue!=NULL)
{
if(xQueueReceive(test_Queue,&test_queue,portMAX_DELAY))
{
}
}
/**********二值信号量**************/
#include "semphr.h"
SemaphoreHandle_t Binary_test; //定义
BaseType_t xHigherPriorityTaskWoken; //中断需要
Binary_wiredown=xSemaphoreCreateBinary(); //创建二值信号量
//任务级释放信号量
xSemaphoreGive(Binary_test);
//中断级释放信号量
xSemaphoreGiveFromISR(Binary_test,&xHigherPriorityTaskWoken);
//任务级获取信号量
xSemaphoreTake(Binary_test,portMAX_DELAY);
//中断级获取信号量
xSemaphoreTakeFromISR(Binary_test,&xHigherPriorityTaskWoken);
//用法
if(Binary_test!=NULL)
{
if(xSemaphoreTake(Binary_test,portMAX_DELAY)==pdTRUE)//获取信号量
{
}
}
/**********互斥信号量**************/
#include "semphr.h"
//互斥信号量句柄
SemaphoreHandle_t MutexSemaphore; //互斥信号量
//创建互斥信号量
MutexSemaphore=xSemaphoreCreateMutex();
xSemaphoreTake(MutexSemaphore,portMAX_DELAY); //获取互斥信号量
xSemaphoreGive(MutexSemaphore); //释放信号量
/**********事件标志组**************/
#define TOUCHBIT_0 (1<<0)
#define TOUCHBIT_1 (1<<1)
#define TOUCHBIT_2 (1<<2)
#define EVENTBIT_ALL (TOUCHBIT_0|TOUCHBIT_1|TOUCHBIT_2)
EventGroupHandle_t EventGroupHandler; //定义
BaseType_t xHigherPriorityTaskWoken; //中断需要
EventGroupHandler=xEventGroupCreate(); //创建事件标志组
//任务级设置事件位
xEventGroupSetBits(EventGroupHandler,TOUCHBIT_0); //将指定的事件位置1
xEventGroupClearBits(EventGroupHandler,TOUCHBIT_0); //将指定的事件清零
//中断级设置事件位
xEventGroupSetBitsFromISR(EventGroupHandler,TOUCHBIT_0,&xHigherPriorityTaskWoken); //将指定的事件位置1
xEventGroupClearBitsFromISR(EventGroupHandler,TOUCHBIT_0); //将指定的事件清零
//任务级获取事情标志组
xEventGroupGetBits(EventGroupHandler);
//中断级获取事情标志组
xEventGroupGetBitsFromISR(EventGroupHandler);
//任务级等待指定的事件位
xEventGroupWaitBits(
(EventGroupHandle_t)EventGroupHandler,
(EventBits_t)EVENTBIT_ALL,
(BaseType_t)pdTRUE,//退出时EVENTBIT_ALL清除
(BaseType_t)pdFALSE,//或关系
(TickType_t)portMAX_DELAY;//一直阻塞
);
//用法
EventBits_t EventValue;
if(EventGroupHandler!=NULL)
{
EventValue=xEventGroupWaitBits(
(EventGroupHandle_t)EventGroupHandler,
(EventBits_t)EVENTBIT_ALL,
(BaseType_t)pdTRUE,//退出时EVENTBIT_ALL清除
(BaseType_t)pdFALSE,//或关系
(TickType_t)portMAX_DELAY);
if((EventValue&(TOUCHBIT_0))==(TOUCHBIT_0)) //触摸事件
{
}
else if((EventValue&(TOUCHBIT_1))==(TOUCHBIT_1))
{
}
}
/**********任务通知**************/
#include "limits.h"
BaseType_t xHigherPriorityTaskWoken; //中断需要
uint32_t value //保存之前的通知值
//任务通知不需要创建
//任务级发送通知
xTaskNotify(Hardware_TaskHandle(任务句柄), 7(值) , eAction(更新方式)); //带有通知值并且不保留接收任务原通知值
eAction是个枚举类型
typedef enum
{
eNoAction=0,
eSetBits, //更新指定的bit
eIncrement,//通知值加1
eSetValueWithOverwrite, //覆写的方式更新通知值
eSetValueWithoutOverwrite //不覆写通知值
}
xTaskNotifyGive(Hardware_TaskHandle); //不带通知值不保留接受任务的通知值,会将接收任务的通知值加1
xTaskNotifyAndQuery(Hardware_TaskHandle,7(值),eAction(更新方式),&value(保存之前的通知值));//带有通知值并且保留接收任务的原通知值
//中断级发送通知
xTaskNotifyFromISR(Hardware_TaskHandle,3(值),eAction(更新方式),&xHigherPriorityTaskWoken); //xTaskNotify()的中断版本
xTaskNotifyGiveFromISR(Hardware_TaskHandle,&xHigherPriorityTaskWoken);//xTaskNotifyGive()的中断版本
xTaskNotifyAndQueryFromISR(Hardware_TaskHandle,7(值),eAction(更新方式),&value(保存之前的通知值),&xHigherPriorityTaskWoken);//xTaskNotifyAndQuery()的中断版本
//获取任务通知
ulTaskNotifyTake(pdTRUE,portMAX_DELAY); //为pdTRUE,退出函数的时候任务通知值清零,类似二值信号量
//为pfFALSE,推出函数的时候任务通知值减1,类似计数型信号量
xTaskNotifyWait(
uint32_t ulBitsToClearOnEntry,
//没有接受到任务通知时将此任务通知值与改参数的值取反值进行按位与运算,
//此参数为0xffffffff或为ULONG_MAX时将任务通知值清零
uint32_t ulBitsToClearOnExit,
//接受到任务通知,在做完相应的处理退出函数之前将任务通知值与此函数的取反值进行按位与运算
//当参数为0xffffffff或ULONG_MAX的时候就会将任务通知值清零
uint32_t* pulNotificationValue,
//用于保存任务通知值
TickType_t xTicksToWait
//阻塞时间
); //等待任务通知,全功能版通知获取函数
//使用说明:
xTaskNotify( (TaskHandle_t) Infor_TaskHandle,
(uint32_t) (1),
(eNotifyAction) eSetValueWithOverwrite ); //给SCAN发送通知,发送解锁数据
BaseType_t err = 0;
uint32_t NotifyValue = 0;
err = xTaskNotifyWait( (uint32_t) 0x00, //进入函数不会清除任务bit
(uint32_t) ULONG_MAX, //退出函数清除所有bit
(uint32_t*) &NotifyValue, //保存任务通知值
(TickType_t) 0 ); //阻塞时间
if( err == 1 )
{
if( NotifyValue == 1 )
{
}
else if( NotifyValue == 2 )
{
//模拟邮箱用法
#include "limits.h"
BaseType_t err;
xTaskNotify( (TaskHandle_t) Scan_TaskHandle, //任务句柄
(uint32_t) _send_mode, //发送值
(eNotifyAction) eSetValueWithOverwrite ); //覆写模式
err = xTaskNotifyWait( (uint32_t) 0x00, //进入函数不会清除任务bit
(uint32_t) ULONG_MAX, //退出函数清除所有bit
(uint32_t*) &send_mode, //保存任务通知值
(TickType_t) 0 ); //阻塞时间
if( err == pdTURE ) //接收到通知
{
}
//模拟事件组用法
#include "limits.h"
#define Scan_EVENTBIT_0 (1<<0)
#define Scan_EVENTBIT_1 (1<<1)
#define Scan_EVENTBIT_2 (1<<2)
BaseType_t err;
xTaskNotify( (TaskHandle_t) Sceen_TaskHandle, //任务句柄
(uint32_t) Sceen_EVENTBIT_0, //更新位
(eNotifyAction) eSetBits ); //更新指定的bit
err = xTaskNotifyWait( (uint32_t) 0x00, //进入函数不会清除任务bit
(uint32_t) ULONG_MAX, //退出函数清除所有bit
(uint32_t*) &NotifyValue, //保存任务通知值
(TickType_t) 0 ); //阻塞时间
if( err == pdTURE ) //接收到通知
{
if((NotifyValue&Scan_EVENTBIT_0)!=0) //事件0发生
{
}
else if((NotifyValue&Scan_EVENTBIT_1)!=0) //事件1发生
{
}
else if((NotifyValue&Scan_EVENTBIT_2)!=0) //事件2发生
{
}
}
FreeRTOS使用汇总的更多相关文章
- 【FreeRTOS实战汇总】小白博主的RTOS学习实战快速进阶之路(持续更新)
博主是个小白,打算把这段时间系统学习RTOS的文章统一整理到这里,另外本文会给出一些参考性资料和指导性建议: 本文宗旨 FreeRTOS 是由Richard Barry在2003年由设计的,由于其设计 ...
- 【FreeRTOS学习06】深度解剖中断与任务之间同步的具体使用场景
嵌入式系统中中断是必不可少的一部分: [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 1 前言 2 中断特点 3 延迟中断处理 3.1 信号量的使用 3.2 ...
- 【FreeRTOS学习05】深度解剖FreeRTOSConfig.h实现对系统的自定义剪裁
ROM/RAM太小,因此要对系统进行剪裁: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 相关文章 1 系统的剪裁 2 FreeRTOSConfi ...
- 【FreeRTOS学习04】小白都能懂的 Queue Management 消息队列使用详解
消息队列作为任务间同步扮演着必不可少的角色: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 相关文章 1 前言 2 xQUEUE 3 相关概念 3 ...
- 【FreeRTOS学习02】源码结构/数据类型/命名规则总结
个人不是很喜欢FreeRTOS的编程风格,但是没办法,白嫖人家的东西,只能忍了,这里先简单总结一下: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 ...
- 【FreeRTOS学习01】CubeIDE快速整合FreeRTOS创建第一个任务
整个专栏主要是博主结合自身对FreeRTOS的实战学习以及源码分析,基于STM32F767 Nucleo-144平台,在CubeIDE下进行开发,结合官方的HAL库,将硬件环节的问题减少到最小,将精力 ...
- FreeRTOS基础篇教程目录汇总
以下教程(大部分章节)(尤其理论介绍部分)转载自安富莱电子,官网链接: http://forum.armfly.com/forum.php 然后根据安富莱的教程自己做了分析和测试,希望大家共同进步. ...
- 使用 FreeRTOS 时注意事项总结(基础篇教程完结)
以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的初始化流程推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须 ...
- 痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手 ...
- ESP8266常见问题汇总——转载自官网
ESP8266 常见问题 本页面收集esp8266常见问题 概述 本文档主要介绍开发者在ESP8266开发中常见的一些问题. 这些问题主要包括以下几大类: 基本概念相关 ESP8266 相关 AiCl ...
随机推荐
- UBOOT编译--- UBOOT顶层Makefile中目标_all和all的关系及背景(四)
@ 目录 1. 前言 2. 概述 3. 老版本UBOOT(背景) 4. 新版本UBOOT 5. 参考 1. 前言 UBOOT版本:uboot2018.03,开发板myimx8mmek240. 2. 概 ...
- uniapp 微信小程序 配置分享朋友和朋友圈
uniapp 微信小程序 配置分享朋友和朋友圈 首先在小程序中配置微信分享,和微信朋友圈, onShareAppMessage, onShareTimeline 这两个API 和 onLoad 同级目 ...
- 2020最新Java面试题及答案(带完整目录).pdf
一.JVM 二.Java集合 三.Java多线程并发 四.Java基础 五.Spring原理 六.微服务 七.Netty与RPC 八.网络 九.日志 十.RabbitMQ 十一.MongoDB 十二. ...
- USB口3A限流保护芯片。带短路保护
一般说明 PW1503是超低RDS(ON)开关,具有可编程的电流限制,以保护电源源于过电流和短路情况.它具有超温保护以及反向闭锁功能. PW1503采用薄型(1毫米)5针薄型SOT封装,提供可调版本. ...
- 进击的K8S:Kubernetes基础概念
Kubernetes简介 Kubernetes简称K8S(因为k和s中间有8个字母),是一个开源的容器集群管理平台,基于Go语言编写. 使用K8S,将简化分布式系统上的容器应用部署,使得开发人员可以专 ...
- 无人机集群的分布式协作 VI-SLAM
以下内容来自从零开始机器人SLAM知识星球 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 论文# D2SLAM: Decentralized and Distributed Col ...
- 小程序与app区别及测试点
小程序和app区别 1. 用户获取渠道区别 小程序: 二维码.用户分享推荐.搜索小程序 APP: 需要去应用市场(或其他)下载 2. 下载.安装卸载 小程序: 不需下载安装,清除时直接删除小程序 AP ...
- 用Echarts实现SpreadJS引用从属关系可视化
在金融行业,我们经常会有审计审查的需求,对某个计算结果进行审查,但是这个计算结果可能依赖多个单元格,而且会有会有多级依赖的情况,如果让我们的从业人员靠眼睛找,工作量巨大,而且准确性存疑,基本上死路一条 ...
- JDBC中文乱码问题
解决JDBC中文数据存入数据库乱码问题 ?useUnicode=true&characterEncoding=utf-8
- CLISP学习(二)
它是一门函数式语言,你要用函数的思维来思考. 只不过与数学的表达不同的是,数学里的函数是在括号外 f(x) ,而lisp是在括号内,以列表的形式(f x), cos(x) --> (cos x ...