【FreeRTOS 事件】任务通知事件

2023-11-16

普通任务通知事件创建创建及运行,参阅安富莱电子demo

#define BIT_0	(1 << 0)
#define BIT_1	(1 << 1)

static TaskHandle_t xHandleTaskUserIF = NULL;
static TaskHandle_t xHandleTaskMsgPro = NULL;

static void vTaskTaskUserIF(void *pvParameters)
{
	uint8_t ucKeyCode;
	uint8_t pcWriteBuffer[500];

    while(1)
    {
		ucKeyCode = bsp_GetKey();
		
		if (ucKeyCode != KEY_NONE)
		{
			switch (ucKeyCode)
			{
				/* K1键按下 打印任务执行情况 */
				case KEY_DOWN_K1:			 
					printf("=================================================\r\n");
					printf("任务名      任务状态 优先级   剩余栈 任务序号\r\n");
					vTaskList((char *)&pcWriteBuffer);
					printf("%s\r\n", pcWriteBuffer);
				
					printf("\r\n任务名       运行计数         使用率\r\n");
					vTaskGetRunTimeStats((char *)&pcWriteBuffer);
					printf("%s\r\n", pcWriteBuffer);
					break;
				
				/* K2键按下,直接发送事件标志设置给任务vTaskMsgPro,置位bit0 */
				case KEY_DOWN_K2:
					printf("K2键按下,任务vTaskMsgPro事件标志位bit0被置位 \r\n");
					xTaskNotify(xHandleTaskMsgPro, /* 目标任务 */
								BIT_0,             /* 设置目标任务事件标志位bit0  */
								eSetBits);         /* 将目标任务的事件标志位与BIT_0进行或操作, 
				                                      将结果赋值给事件标志位。*/
					break;
				
				/*  K3键按下,直接发送事件标志设置给任务vTaskMsgPro,置位bit1 */
				case KEY_DOWN_K3:
					printf("K3键按下,任务vTaskMsgPro事件标志位bit1被置位 \r\n");
					xTaskNotify(xHandleTaskMsgPro, /* 目标任务 */
								BIT_1,             /* 设置目标任务事件标志位bit0  */
								eSetBits);         /* 将目标任务的事件标志位与BIT_0进行或操作, 
				                                      将结果赋值给事件标志位。*/
				
				/* 其他的键值不处理 */
				default:                     
					break;
			}
		}
		
		vTaskDelay(20);
	}
}


static void vTaskMsgPro(void *pvParameters)
{
	BaseType_t xResult;
	const TickType_t xMaxBlockTime = pdMS_TO_TICKS(500); /* 设置最大等待时间为500ms */
	uint32_t ulValue;
	
    while(1)
    {
		/*
			第一个参数 ulBitsToClearOnEntry的作用(函数执行前):
		          ulNotifiedValue &= ~ulBitsToClearOnEntry
		          简单的说就是参数ulBitsToClearOnEntry那个位是1,那么ulNotifiedValue
		          的那个位就会被清零。

		          这里ulBitsToClearOnEntry = 0x00000000就是函数执行前保留所有位。
		
		    第二个参数 ulBitsToClearOnExit的作用(函数退出前):			
				  ulNotifiedValue &= ~ulBitsToClearOnExit
		          简单的说就是参数ulBitsToClearOnEntry那个位是1,那么ulNotifiedValue
		          的那个位就会被清零。

				  这里ulBitsToClearOnExi = 0xFFFFFFFF就是函数退出前清楚所有位。
		
		    注:ulNotifiedValue表示任务vTaskMsgPro的任务控制块里面的变量。		
		*/
		
		xResult = xTaskNotifyWait(0x00000000,      
						          0xFFFFFFFF,      
						          &ulValue,        /* 保存ulNotifiedValue到变量ulValue中 */
						          xMaxBlockTime);  /* 最大允许延迟时间 */
		
		if( xResult == pdPASS )
		{
			/* 接收到消息,检测那个位被按下 */
			if((ulValue & BIT_0) != 0)
			{
				printf("接收到K2按键按下消息, ulNotifiedValue = 0x%08x\r\n", ulValue);
		
			}

			if((ulValue & BIT_1) != 0)
			{
				printf("接收到K3按键按下消息, ulNotifiedValue = 0x%08x\r\n", ulValue);
			}
		}
		else
		{
			/* 超时 */
		}
    }
}
int main(void)
{
	/* 
	  在启动调度前,为了防止初始化STM32外设时有中断服务程序执行,这里禁止全局中断(除了NMI和HardFault)。
	  这样做的好处是:
	  1. 防止执行的中断服务程序中有FreeRTOS的API函数。
	  2. 保证系统正常启动,不受别的中断影响。
	  3. 关于是否关闭全局中断,大家根据自己的实际情况设置即可。
	  在移植文件port.c中的函数prvStartFirstTask中会重新开启全局中断。通过指令cpsie i开启,__set_PRIMASK(1)
	  和cpsie i是等效的。
     */
	__set_PRIMASK(1);  
	
	/* 创建任务 ,具体创建任务参阅上一篇【FreeRTOS 任务】任务创建及运行 */
	AppTaskCreate();

    /* 启动调度,开始执行任务 */
    vTaskStartScheduler();

	/* 
	  如果系统正常启动是不会运行到这里的,运行到这里极有可能是用于定时器任务或者空闲任务的
	  heap空间不足造成创建失败,此要加大FreeRTOSConfig.h文件中定义的heap大小:
	  #define configTOTAL_HEAP_SIZE	      ( ( size_t ) ( 17 * 1024 ) )
	*/
	while(1);
	
/* 以上函数 vTaskMsgPro 中的 xTaskNotify 任务通知API是在普通任务下使用,在中断中要使用以下两个函数释放*/
static void TIMx_IRQHandler(void)
{
	BaseType_t xHigherPriorityTaskWoken = pdFALSE;
	xTaskNotifyFromISR(	xHandleTaskMsgPro,  /* 目标任务 */
						BIT_0, 				/* 设置目标任务事件标志位 bit0 */
						eSetBits, 			/* 将目标任务的事件标志位与 BIT_0 进行或操作, 将结果赋值给事件标志位 */
						&xHigherPriorityTaskWoken);
						
	/* 如果 xHigherPriorityTaskWoken = pdTRUE,那么退出中断后切到当前最高优先级任务执行 */
	portYIELD_FROM_ISR(xHigherPriorityTaskWoken)
}

STM32CubeMX 二值信号量创建及运行

/* USER CODE BEGIN 4 */

osThreadId defaultTaskHandle = NULL;
osThreadId SignalTaskHandle  = NULL;


void SignalTask(void const * argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
	osEvent EventValue;
  for(;;)
  {
  		/* 参数说明:函数退出前进行按位与操作(默认0xFFFFFFFF),最大等待时间*/
  		/* 返回值:
		   //返回值是一个结构体
		   	typedef struct  {
				  osStatus                 status;     ///< 返回状态信息
				  union  {
				    uint32_t                    v;     ///< 不理睬
				    void                       *p;     ///< 不理睬
				    int32_t               signals;     ///< 事件消息
				  } value;                             ///< 联合体名称
				  union  {
				    osMailQId             mail_id;     ///< 不理睬
				    osMessageQId       message_id;     ///< 不理睬
				  } def;                               ///< 不理睬
				} osEvent;
		*/
		EventValue = osSignalWait (0xFFFFFFFF, osWaitForever);	
		if(EventValue.status == osEventSignal)
		{				
			
				HAL_UART_Transmit(&huart1,"EventVa  lue is copy\r\n",strlen("EventValue is copy\r\n"),1000);
				switch (EventValue.value.signals)
				{
					case 0x01:
							HAL_UART_Transmit(&huart1,"EventValue is 0x01\r\n",strlen("EventValue is 0x01\r\n"),1000);
						break;
					
					case 0x02:
							HAL_UART_Transmit(&huart1,"EventValue is 0x02\r\n",strlen("EventValue is 0x02\r\n"),1000);
						break;
					
					case 0x03:
							HAL_UART_Transmit(&huart1,"EventValue is 0x03\r\n",strlen("EventValue is 0x03\r\n"),1000);
						break;	
					default:	
							HAL_UART_Transmit(&huart1,"EventValue is  outside \r\n",strlen("EventValue is  outside \r\n"),1000);
						break;	
				}	
		}
  }
  /* USER CODE END 5 */
}


void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
	int32_t count = 0;
	int8_t  bits = 0x01;
  for(;;)
  {
		HAL_UART_Transmit(&huart1,"StartDefaultTask\r\n",strlen("StartDefaultTask\r\n"),1000);	
		count++;
		if(count == 10)
		{
				count = 0;
				/* 参数说明:要通知任务的任务句柄,事件消息 */
				/* STM32CubeMX 在 osSignalSet 函数体中封装好了 xTaskGenericNotifyFromISR 函数体,可以直接在中断中调用 */
				osSignalSet (SignalTaskHandle, bits);
				bits = bits + 1;
		}
	  osDelay(100);	
  }
  /* USER CODE END 5 */
}
/* USER CODE END 4 */


int main(void)
{

  /* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityLow, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  osThreadDef(SignalTask, SignalTask, osPriorityHigh, 0, 128);
  SignalTaskHandle = osThreadCreate(osThread(SignalTask), NULL);
  /* USER CODE END RTOS_THREADS */
  
  /* Start scheduler */
  osKernelStart();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【FreeRTOS 事件】任务通知事件 的相关文章

  • 基于HAL库的FREERTOS----------二.任务API函数

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • STM32CubeMX+FreeRTOS学习笔记(一)

    嵌入式实时操作系统FreeRTOS 基本概述 在嵌入式领域当中 实时操作系统的应用越来越广泛了 目前嵌入式操作系统种类很多 例如 Clinux C OS II C OS III FreeRTOS RT Thread等等 这篇文章所记录的就是
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • FreeRTOS学习笔记(8)---- 软件定时器

    使用FreeRTOS软件定时器需要在文件FreeRTOSConfig h先做如下配置 1 configUSE TIMERS 使能软件定时器 2 configTIMER TASK PRIORITY 定时器任务优先级 3 configTIMER
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 防止GCC LTO删除函数

    我使用 GCC ARM Embedded 和 FreeRTOS FreeRTOS具有的功能vTaskSwitchContext 仅在某些情况下使用 内联汇编代码 问题是 当我使用LTO时 GCC不考虑内联汇编代码并认为该函数没有被使用 因此
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站

随机推荐

  • A*自动寻路算法—java版(八方向版)

    上一篇博客分享了Java版的自动寻路 但是只是上下左右四个方向的 今天把八方向的也分享出来 既然四方向的已经成功了 那么改进成八方向的 只要注意两个地方就可以了 一个是获取四周方块的时候 一个是移动的时候 一 获取四周方块 在autofin
  • Centos 配置yum 的几种方式、

    一 yum 的 基础运用 1 命令形式 yum option command package 选项 option h 帮助 y 直接安装的意思yes q 不显示安装的过程 其他的可以通过 yum h 查看 同样 command 也通过 yu
  • 机器学习之基于LDA的人脸识别

    目录 LDA降维 思想 matlab代码 fisherface 思想 matlab代码 人脸识别 思想 matlab代码 LDA降维 思想 首先 代码通过使用dir函数获取指定路径下所有以 bmp 结尾的文件 并存储在变量pictures中
  • idea中 maven 本地仓库有jar包,但还是找不到,解决打包失败和无法引用的问题

    如果这篇文章能帮到大家 并且你也想了解程序员的 副业 请关注博主的微信公众号 程序员副业笔记 因为maven私服挂了 无法下载jar包 通过阿里云公共仓库下载的jar 然后放入本地仓库后 还是无法引用 打包报错 百度了一下问题的解决办法 因
  • 思考:开源软件的开发过程,以及商业使用 (*****)

    明确软件的具体用途 功能 以及迭代的各种边界 如果不将所需的软件进行集合化 那么 像 github 中的软件那样 自己去搜索 筛选 测试等等 这是一件很耗费时间和精力的事情 编写和筛选各种所需的库 或其他 优先筛选已有的 现成的开源库 以及
  • 数据库连接池实现原理

    数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接 并对外暴露数据库连接获取和返回方法 如 外部使用者可通过getConnection 方法获取连接 使用完毕后再通过releaseConnection 方法将连接返回 注意此时连
  • uniapp中uni.onTabBarMidButtonTap页面跳转注意事项

    uniapp开发中 如果需要实现底部导航中间按钮 需要监听uni onTabBarMidButtonTap 但是如果要在该事件回调函数中实现页面跳转 url必须以 开头 即如下 否则无法实现页面跳转 搞了2个小时才发现 特此记录 避免以后再
  • 华为华三思科 交换机基础配置一览

    console密码修改 华为 user interface console 0 authentication mode password set authentication password cipher XXXXXXXXX 华三 lin
  • 图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作

    大家看这篇博文前可以先看一看下面这篇博文 下面这篇博文是这篇博文的基础 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程 并利用OpenCV的函数erode 和函数dilate 对图像进行腐蚀和膨胀操作 图像形态学腐蚀可以将细小的噪声区
  • android看本地视频播放器下载,Android平台上5款最好的本地视频播放软件

    5 看本地视频随着新技术的快速发展 网络机顶盒的分辨率已经达到了4k级别 不仅可以播放1080p全高清影片 也能观看3d原盘 以及4k超高清影片 但需要连接u盘或者其他移动存储设备 随着人们对影视娱乐高清晰 高音效的追求 以及现代家庭对大屏
  • 无法载入增效工具_AfterEffects错误:关于E3D插件无法加载增效工具“Element.aex”。(126)(48::46)...

    大家好 关于E3D报错的问题 相信是很多人在使用AE进行创作和套模板时遇到的一块心病 虽然报错 但是依然不舍得放弃 可还是很难得到解决 那么接下来我给同学们总结一下关于E3D报错的解决途径和步骤 AE报错 could not be load
  • React入门——3.元素渲染

    本节内容为对元素渲染 React的整理归纳 如果你直接阅读此React官方文档较为吃力 可以对照本节与React文档中的相应章节作为解释 也许会加快你的阅读理解速度 const element h1 Hello World h1 这是一个很
  • less(二) less的变量和注释

    上篇中 我们简单了解了less的使用环境和怎么使用less 下面我们了解一下less 的变量和注释 less 的注释 这是第一种注释 这是第二种注释 上面的第一种注释麻烦一点 但是当我们的less文件编译成css文件后 css文件中注释依然
  • Mac 安装openssl

    1 安装openssl brew install openssl 1 1 2 修改环境变量 export PATH usr local opt openssl 1 1 bin PATH 3 创建软链接 cd usr local includ
  • es统计所有数量的坑

    最近在统计线上的数量时 会发现始终都是10000 觉得很奇怪 先来说一下场景 我使用的是7 2版本的es 需要统计所有数量 后来发现数量下面有个relation gte的属性 然后在网上一搜 发现es 7 X在数据量很大时 数量都会是100
  • Linux Ubuntu安装RabbitMQ服务

    文章目录 前言 1 安装erlang 语言 2 安装rabbitMQ 3 内网穿透 3 1 安装cpolar内网穿透 支持一键自动安装脚本 3 2 创建HTTP隧道 4 公网远程连接 5 固定公网TCP地址 5 1 保留一个固定的公网TCP
  • burpsuit to run burp suite using java 17+

    根据报错提示 在命令行运行时后面加上这句代码 add opens java desktop javax swing ALL UNNAMED add opens java base java lang ALL UNNAMED 即 javaw
  • 数据结构第六章——图

    数据结构第六章 图 图的定义和术语 G V E V 顶点 数据元素的 有穷非空集合 E 边的有穷集合 无向图 每条边都是无方向的 有向图 每条边都是有方向的 完全图 任意两个顶点都有一条边两连 无向完全图 n个顶点 n n 1 2条边 有向
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】需要打开多少监控器

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 需要打开多少监控器 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 某长方形停车场 每个车位上方都有对应监控器 当且仅当在当前车位或者前后左右四个方向任意一个车位范围停
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta