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 ...
随机推荐
- hashcat 命令
hashcat --force --stdout -a 6 tmp.txt ?d?d?d?d?d?d?d > result.txt tips:将tmp.txt字典中的内容与7位随机掩码字符组合, ...
- 深度学习之logistics回归
在开始之前,事先声明本文参考[中文][吴恩达课后编程作业]Course 1 - 神经网络和深度学习 - 第二周作业_何宽的博客-CSDN博客_吴恩达课后编程作业 加上自己的理解,希望可以不用重复看吴恩 ...
- Day18.2:对象创建的内存分析图解
对象创建的内存分析 我们从两块最常用的内存空间对对象创建进行内存分析 堆内存:存放的是对象的具体信息:在程序之中堆内存空间的开辟是通过new完成的 栈内存:存放的是对象的地址信息,即通过地址找到堆内存 ...
- i春秋Test
点开是个莫名其妙的网站...看看源码, 第一排好像有点东西 最后也有点东西,所以我们直接百度海洋CMS漏洞(https://www.freebuf.com/vuls/150042.html) 所以这里 ...
- 复现MySQL的索引选择失误以及通过OPTIMIZER_TRACE分析过程
复现MySQL的索引选择失误以及通过OPTIMIZER_TRACE分析过程 验证环境:MySQL 5.7.39 windows-pc 一.构造数据(生成150万数据) 构建一张账户表,带有一级部门id ...
- java面试题-线程
简述线程.程序.进程的基本概念.以及他们之间关系是什么? 系统运行程序到停止就是一个进程创建到消亡的过程,而线程则是进程的更小单位 线程有哪些基本状态? 初始,运行中,等待,阻塞,超时,终止1 关注公 ...
- 【每日一题】【栈】2022年2月2日-NC40 两个链表生成相加链表
描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. 答案:栈 import java.util.*; /* ...
- 【实时数仓】Day05-ClickHouse:入门、安装、数据类型、表引擎、SQL操作、副本、分片集群
一.ClickHouse入门 1.介绍 是一个开源的列式存储数据库(DBMS) 使用C++编写 用于在线分析查询(OLAP) 能够使用SQL查询实时生成分析数据报告 2.特点 (1)列式存储 比较: ...
- hyperf 配置 https 访问
最近用hyperf写了支付系统,本地调试支付完成,打包上线部署,要解决https协议进行相应的访问,但是hyperf 官方没有找到相关的ssl配置说明.搜了一下soole还是有几个案例说明,据我的了解 ...
- python 之 random.sample() 报ValueError: Sample larger than population or is negative
def device_id(): device = ''.join(random.sample(string.digits, 19)) return device print(device_id()) ...