/**********创建任务**************/
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. 原来用 MySQL 也可以做全文检索

    我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 有朋友聊到他们的系统中要接入全 ...

  2. 推荐一款 .NET 编写的 嵌入式平台的开源仿真器--Renode

    Renode 是一个开发框架,通过让你模拟物理硬件系统来加速物联网和嵌入式系统开发. Renode 可以模拟 Cortex-M.RISC-V 等微控制器,不仅可以模拟 CPU指令,还可以模拟外设,甚至 ...

  3. tomcat 随windows启动

    有时候服务器会突然断电,维护管理员只会帮我们启动服务器,但是不会不会帮我们启动Tomcat. 1.进入tomcat的bin文件夹,找到startup.bat,右键生成快捷方式到桌面. 2.点击桌面左下 ...

  4. 【大数据-课程】高途-天翼云侯圣文-Day2:离线数仓搭建分解

    一.内容介绍 昨日福利:大数据反杀熟 今日:数据看板 离线分析及DW数据仓库 明日:实时计算框架及全流程 一.数仓定义及演进史 1.概念 生活中解答 2.数据仓库的理解 对比商品仓库 3.数仓分层内容 ...

  5. 【Java EE】Day11 BootStrap、响应式布局、栅格系统、CSS样式、案例

    一.BootStrap介绍 https://v3.bootcss.com/css/#overview 1.概念 基于三剑客开发的前端开发框架 定义了许多css样式和js插件,从而得到丰富的页面效果 依 ...

  6. 【数据结构与算法】希尔排序 python和c++实现

    算法思路 每一次:固定间隔把数据分组,每一组进行排序 每次比上次选取更小的间隔分组,再每组排序,直到间隔为1 代码 c++:(越看越不明白了,后看) int gap = length;//length ...

  7. python安装与初识

    一.Linux基础 - 计算机以及日后我们开发的程序防止的服务器的简单操作 二.Python开发 http://www.cnblogs.com/wupeiqi/articles/5433893.htm ...

  8. 周而复始,往复循环,递归、尾递归算法与无限极层级结构的探究和使用(Golang1.18)

    所有人都听过这样一个歌谣:从前有座山,山里有座庙,庙里有个和尚在讲故事:从前有座山....,虽然这个歌谣并没有一个递归边界条件跳出循环,但无疑地,这是递归算法最朴素的落地实现,本次我们使用Golang ...

  9. 15、MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

    转载自 一.报错信息: Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollback ...

  10. 手写Pinia存储的数据持久化插件

    Pinia和Vuex的通病 Pinia和vuex的通病就是,页面刷新会导致数据丢失 解决通病 一.新建store import { defineStore } from 'pinia' //单独存放S ...