/**********创建任务**************/
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. [排序算法] 简单选择排序 (C++)

    简单选择排序原理 简单选择排序 SelectSort 是一种十分直观地排序方法.其原理是每次从未排序的元素中找到当前最小的元素,放在当前未排序序列的首位.一直重复操作直至最后未排序的元素个数为 0,即 ...

  2. Vue GET xxxx/sockjs-node/info?t=1573626343344 net::ERR_CONNECTION

    看了很多资料,都说是关闭热更新要么注释掉代码完美解决.我寻思这不就没有热更新功能了吗. 不妨试试检查下项目端口是否一致,然后查看下请求地址是否是本地地址.有可能是因为被shadowsocket代理了 ...

  3. MYSQL下载 环境配置 修改密码 基本SQL语句

    目录 存取数据的演变史 数据库软件应用史 数据库的本质 数据库的分类 关系型数据库 特征 常见关系型数据库 非关系型数据库 特征 常见非关系型数据库 mysql简介 mysql下载 启动mysql 系 ...

  4. 发送http2请求

    有时服务器会检测http协议版本,有http/1.1和h2,requests发送的是http1.1的请求 # pip install httpx client = httpx.Client(http2 ...

  5. Faster RCNN论文阅读

    引言 当前最先进的目标检测模型是由区域提案方法和基于区域的卷积神经网络引领的,由于共享计算,卷积网络花费的时间已经大大减小了,所以当前检测系统的瓶颈就是如何减小区域提案生成部分的花费时间.当前流行的区 ...

  6. LeetCode-03 无重复字符的最长子串(Longest Substring Without Repeating Characters)

    题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 示例  1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &qu ...

  7. 学习.NET MAUI Blazor(四)、路由

    Web应用程序的可以通过URL将多个页面串联起来,并且可以互相跳转.Web应用主要是使用a标签或者是服务端redirect来跳转.而现在流行的单页应用程序 (SPA) ,则通过路由(Router)来实 ...

  8. [LeetCode]最大连续1的个数

    题目 代码 class Solution { public: int findMaxConsecutiveOnes(vector<int>& nums) { int length= ...

  9. 如何在现有的Vue项目中嵌入 Blazor项目?

    目前官方只提供了angular和react俩种示例,所以本教程将来讲解如何在Vue的现有项目中使用,上期已经做好了react的教材! 准备流程 Vue 项目创建流程 使用Vue创建一个Demo项目 全 ...

  10. ng + zorro angular表格横纵向合并,横向目前是手动,纵向是自动合并,微调后可适配三大框架使用

    表格横纵向合并,可以看一下代码编写之前和之后的样式,先上图~~ 表格页面文件.html <h1>正常表格</h1> <nz-table #colSpanTable [nz ...