/**********创建任务**************/
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使用汇总的更多相关文章

  1. 【FreeRTOS实战汇总】小白博主的RTOS学习实战快速进阶之路(持续更新)

    博主是个小白,打算把这段时间系统学习RTOS的文章统一整理到这里,另外本文会给出一些参考性资料和指导性建议: 本文宗旨 FreeRTOS 是由Richard Barry在2003年由设计的,由于其设计 ...

  2. 【FreeRTOS学习06】深度解剖中断与任务之间同步的具体使用场景

    嵌入式系统中中断是必不可少的一部分: [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 1 前言 2 中断特点 3 延迟中断处理 3.1 信号量的使用 3.2 ...

  3. 【FreeRTOS学习05】深度解剖FreeRTOSConfig.h实现对系统的自定义剪裁

    ROM/RAM太小,因此要对系统进行剪裁: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 相关文章 1 系统的剪裁 2 FreeRTOSConfi ...

  4. 【FreeRTOS学习04】小白都能懂的 Queue Management 消息队列使用详解

    消息队列作为任务间同步扮演着必不可少的角色: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 相关文章 1 前言 2 xQUEUE 3 相关概念 3 ...

  5. 【FreeRTOS学习02】源码结构/数据类型/命名规则总结

    个人不是很喜欢FreeRTOS的编程风格,但是没办法,白嫖人家的东西,只能忍了,这里先简单总结一下: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 ...

  6. 【FreeRTOS学习01】CubeIDE快速整合FreeRTOS创建第一个任务

    整个专栏主要是博主结合自身对FreeRTOS的实战学习以及源码分析,基于STM32F767 Nucleo-144平台,在CubeIDE下进行开发,结合官方的HAL库,将硬件环节的问题减少到最小,将精力 ...

  7. FreeRTOS基础篇教程目录汇总

    以下教程(大部分章节)(尤其理论介绍部分)转载自安富莱电子,官网链接: http://forum.armfly.com/forum.php 然后根据安富莱的教程自己做了分析和测试,希望大家共同进步. ...

  8. 使用 FreeRTOS 时注意事项总结(基础篇教程完结)

    以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的初始化流程推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须 ...

  9. 痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手 ...

  10. ESP8266常见问题汇总——转载自官网

    ESP8266 常见问题 本页面收集esp8266常见问题 概述 本文档主要介绍开发者在ESP8266开发中常见的一些问题. 这些问题主要包括以下几大类: 基本概念相关 ESP8266 相关 AiCl ...

随机推荐

  1. 【云原生 · Kubernetes】部署kube-apiserver集群

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 部署kube-apiserver集群 10.1 创建kube-apiserver 证书 10 ...

  2. 垃圾回收、python中的流程控制

    垃圾回收机制 1.概念 垃圾回收机制(GC):是Python解释器自带一种机制,专门用来回收不可用的变量值所占用的内存空间 2.原理 Python的垃圾回收机制(GC)主要使用引用计数(referen ...

  3. Easy-Classification-验证码识别

    1.背景 Easy-Classification是一个应用于分类任务的深度学习框架,它集成了众多成熟的分类神经网络模型,可帮助使用者简单快速的构建分类训练任务.   案例源代码 Easy-Classi ...

  4. Datawhale组队学习_Task03:详读西瓜书+南瓜书第4章

    第4章 决策树 4.1 基本流程 #输入:训练集D={${(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}$}; #属性集A=${{a_1,a_2,...,a_d}}$. #过程: ...

  5. 【SQL知识】SQL中的join操作总结:内连接、外连接(左右全)

    一.含义 基于表之间的共同字段,把来自两个或多个表的行结合起来 二.分类 内连接:join / inner join 外连接:left join / right join / full outer j ...

  6. 【每日一题】【DFS&每个点都调用一次前后左右】由1连接的岛屿数量-211031/220216

    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成. 此外,你可以假设该网格的四条边 ...

  7. ATM项目

    ATM项目实战 项目需求分析: 1.注册(密码要加密) 2.登陆 3.查看余额 4.提现(可自定手续费) 5.还款 6.转账 7.查看流水 8.添加购物车功能 (商品可配置) 9.查看购物车功能 10 ...

  8. before-after-hook钩子函数

    before-after-hook 最近看别人的代码,接触到一个插件,before-after-hook,百度搜一圈也没有看到什么地方有教程,看这个字面意思是一个hook,和axios里面的拦截器,v ...

  9. 三步快速搭建Typora图床(SM.MS+PicGo)

    三步快速搭建Typora图床(基于SM.MS+PicGo) 前言 在有些同学使用Typora的过程中,会发现Typora不像Word一样,在文档脱离本机后依然正常显示图片,自己的tyopora文件在发 ...

  10. [攻防世界][江苏工匠杯]unseping

    打开靶机对应的url 上来就是代码审计 <?php highlight_file(__FILE__); class ease{ private $method; private $args; f ...