关于FreeRTOS操作系统遇到的一些小问题

2023-05-16

1.故障描述

今天在学习FreeRTOS操作系统关于计数量信号实验这一块的时候遇到了一个非常有意思的实验现象。

就是程序任务的启动流程都是设置正确的,但是两任务会有一个任务进不去。

程序代码如下

#include "bsp_config.h"
#include "bsp_led.h"
#include "bsp_usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "bsp_key.h"
#include "semphr.h"

void BSP_Init(void);
void AppTaskCreate(void* pvParameters);
void Take_Task(void* pvParameters);
void Give_Task(void* pvParameters);

TaskHandle_t AppTaskCreate_Handle;
TaskHandle_t Take_Task_Handle;
TaskHandle_t Give_Task_Handle;

SemaphoreHandle_t CountSem_Handle;

int main(void)
{
	float image_y, image_x, image_a;
	BSP_Init();
	
	for (image_y = 1.5f;image_y > -1.5f;image_y -= 0.1f)
	{
		for (image_x = -1.5f;image_x < 1.5f;image_x += 0.05f)
		{
			image_a = image_x*image_x + image_y*image_y - 1;
			putchar(image_a*image_a*image_a - image_x*image_x*image_y*image_y*image_y <= 0.0f ? '*' : ' ');
		}
			putchar('\n');
	}	
		
	xTaskCreate	((TaskFunction_t	)AppTaskCreate,
								(const char *			)"AppTaskCreate",
								(uint16_t				 	)512,
								(void *						)NULL,
								(UBaseType_t			)1,
								(TaskHandle_t * 	)&AppTaskCreate_Handle);
	vTaskStartScheduler();
}

void AppTaskCreate(void* pvParameters)
{	
	
	taskENTER_CRITICAL();
	
	CountSem_Handle=xSemaphoreCreateCounting( 5, 5 );

	xTaskCreate	((TaskFunction_t	)Take_Task,
								(const char *			)"Take_Task",
								(uint16_t				 	)512,
								(void *						)NULL,
								(UBaseType_t			)2,                 //*******
								(TaskHandle_t * 	)&Take_Task_Handle);
								
	xTaskCreate	((TaskFunction_t	)Give_Task,
								(const char *			)"Give_Task",
								(uint16_t				 	)512,
								(void *						)NULL,
								(UBaseType_t			)2,                 //*******
								(TaskHandle_t * 	)&Give_Task_Handle);
											
	vTaskDelete(AppTaskCreate_Handle);		

	taskEXIT_CRITICAL();
}

void Give_Task(void* pvParameters)
{
	uint8_t backUpKey1 = 0;
	BaseType_t xReturn = pdTRUE;
	
	while(1)
	{
		if(KEY1 != backUpKey1)
		{
			if(KEY1 == 1)
			{
				xReturn = xSemaphoreTake( CountSem_Handle, 0);
				
				if(pdTRUE == xReturn)
					printf("成功申请到车位\r\n");
				else
					printf("未成功申请到车位(车位已满)\r");
			}
			backUpKey1=KEY1;
		}
		//vTaskDelay(10);//***
	}
}

void Take_Task(void* pvParameters)
{
	uint8_t backUpKey2 = 0;
	BaseType_t xReturn = pdTRUE;
	
	while(1)
	{
		if(KEY2 != backUpKey2)
		{
			if(KEY2 == 1)
			{
				xReturn = xSemaphoreGive( CountSem_Handle);
				
				if(pdTRUE == xReturn)
					printf("已释放一个车位\r\n");
			}
			backUpKey2=KEY2;
		}	
		//vTaskDelay(10);//***
	}
}

void BSP_Init()
{
	InitLED();
	USART_Config();
	InitKey();
}

2.程序详解

以上程序就是野火教程里面一个关于计数信号量的一个计数实验。用来模拟停车场的实验,具体程序我做了一些精简与修改。

可以看到这两个按键检测任务:

就是很普通的检测按键是否被按下,但是这里有一个延时代码被我注释掉了,这是为什么呢。很明显,在硬件消抖电路中我们完全不需要添加延时消抖程序,但是我发现这样做就会出现这两个任务有一个运行不了,经过我对程序的反复查看,终于发现怎样修改这个程序。

3.修改方法

需要注意的行数我在那一行添加了一行醒目的行注释

1.在调用这两个任务的时候,和主任务一样都会设置这个中断优先级,而问题恰恰出现在这个中断优先级,由于我没有添加这个延时函数,在程序初始化的时候由于中断优先级的设置,这个程序始终跑不到低优先级的这个按键任务中(一直死循环在优先级高的按键任务中)。所以我的修改方法就是将这两个按键的任务函数的优先级设置为一样的。

2.如果说需要设置不同的优先级,那么就需要添加这个延时函数。

4.结尾

通过这个实验我终于认识到了一个知识盲区,就是野火的板子明明就设置了硬件消抖,但为什么还需要添加这么长的延时函数(10个系统节拍)。现在我了解到因为设置了不同的优先级,如果没有这个延时那么系统运行的时候就会一直卡在优先级较高的任务中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于FreeRTOS操作系统遇到的一些小问题 的相关文章

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

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • FreeRTOS软件定时器创建、复位、开始和停止(备忘)

    目录 一 简介 1 1 开发环境 1 2 摘要 二 STM32CubeIDE配置 三 创建定时器 3 1 头文件声明 3 2 工程文件定义 3 3 创建定时器 3 4 开启 复位 和关闭定时器 四 定时器回调函数 一 简介 1 1 开发环境
  • FreeRTOS系列

    本文主要介绍如何在任务或中断中向队列发送消息或者从队列中接收消息 使用STM32CubeMX将FreeRTOS移植到工程中 创建两个任务以及两个消息队列 并开启两个中断 两个任务 Keyscan Task 读取按键的键值 并将键值发送到队列
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • FreeRTOS ------- 任务(task)

    在学习RTOS的时候 个人觉得带着问题去学习 会了解到更多 1 什么是任务 在FreeRTOS中 每个执行线程都被称为 任务 每个任务都是在自己权限范围内的一个小程序 其具有程序入口每个任务都是在自己权限范围内的一个小程序 其具有程序入口通
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • freeRTOS手册 第六章 . 中断管理

    如果我对本翻译内容享有所有权 允许任何人复制使用本文章 不会收取任何费用 如有平台向你收取费用与本人无任何关系 第六章 中断管理 章节介绍和范围 事件 嵌入式实时系统必需对环境中的事件做出响应 比如 外部网络设备收到一个发送给TCP IP栈
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • RT-Thread记录(五、RT-Thread 临界区保护与FreeRTOS的比较)

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • 【FreeRTOS 事件】任务通知事件

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

    任务创建和删除API函数位于文件task c中 需要包含task h头文件 task h里面包函数任务的类型函数 例如 对xTaskCreate的调用 通过指针方式 返回一个TaskHandle t 变量 然后可将该变量用vTaskDele
  • FreeRTOS多任务调度器基础

    Cortex M4中SysTick调度器核心 Cortex M4中的中断管理 Cortex M4中影子栈指针 Cortex M4中SVC和PendSV异常 1 Cortex M4中SysTick调度器核心 systick每一次中断都会触发内
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

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

随机推荐

  • 安卓串口通讯工具库封装及使用

    串口通讯 引言 对于安卓开发的小伙伴来说 xff0c 很少用到串口通信开发 主要用来外接一些硬件设备 xff0c 例如扫码器 xff0c 读卡器 xff0c 体温枪等一些硬件设备 这些设备与安卓之间通过串口来交换数据 如果有安卓串口开发这方
  • shell启动程序的四种方式

    需要执行script sh 文件 方式一 xff1a script sh 执行shell脚本时是在当前shell xff08 称为父shell xff09 开启一个子shell环境 xff0c 此shell脚本就在这个子shell环境中执行
  • ZED深度相机的使用--zed-ros-wrapper

    ZED相机能做什么 可以获取3D RGB点云用于生成地图 xff0c 带有imu传感器可以获取位姿与移动轨迹 xff0c 下面是厂家的宣传内容 下载并安装ZED SDK ZED SDK 3 6 Download Stereolabs Dev
  • 卡尔曼滤波(Kalman Filter)

    卡尔曼滤波 Kalman Filter 微信公众号 xff1a 幼儿园的学霸 个人的学习笔记 xff0c 关于OpenCV 关于机器学习 问题或建议 xff0c 请公众号留言 目录 TOC what is Kalman Filter 举个例
  • git提交Dockerfile到github并关联Dockerhub

    1 注册 amp 登录dockerhub https hub docker com 有账号的直接上边的Sign In登录 xff0c 没有的填写下面的信息 xff0c 进行注册 2 dockerhub方发起与github的账号关联 登录后右
  • 【时间规划】C/C++发展之路--读书

    0 xff1a 图书馆的N本C xff0c C 43 43 书 1 xff1a C语言深度解剖 2 xff1a 高质量C 43 43 c编程指南 3 xff1a C 43 43 primer第四版 4 xff1a Windows程序设计 5
  • 结构体对齐

    C程序结构体对齐 关于结构体对齐我把我的理解写下来 xff1b 结构体对齐的步骤 xff1a 1 xff0c 结构体各个成员对齐 xff1b 2 xff0c 结构体圆整 首先要了解几个概念 xff1a 1 xff0c 指定对齐值 xff1a
  • 全局变量-函数内部不允许修改局部变量的值

    全局变量 num 61 10 def demo1 希望修改全局变量的值 在 python 中 xff0c 是不允许直接修改全局变量的值 如果使用赋值语句 xff0c 会在函数内部 xff0c 定义一个局部变量 num 61 99 print
  • Docker镜像仓库

    Docker镜像仓库 搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现 官网地址 xff1a Docker Hub 简化版镜像仓库 Docker官方的Docker Registry是一个基础版本的Docker镜像
  • Intel 深度摄像D435i 的标定

    这个官方的标定链接 xff0c 先下载这个的pdf 文件在本地容易学习 xff1a https www intel com content www us en support articles 000032303 emerging tech
  • 树莓派Raspberry Pi上安装intel realsense 深度摄像头D435i

    全部按照官方 xff1a https github com IntelRealSense librealsense blob master doc installation raspbian md 更新系统到最新 xff0c 然后再启动 x
  • ROS应用开发入门 服务数据的定义和使用

    ROS是机器人操作系统的简称 xff0c 本文介绍ROS应用开发入门 xff0c 服务数据的定义和使用 客户端和服务端 之间通讯都使用服务数据 service data 本文先定义一个服务数据 xff0c 编译成功后 xff0c 用一个服务
  • ROS应用开发入门 tf 坐标系广播与监听的编程(python)

    ROS是机器人操作系统的简称 xff0c 本文介绍ROS应用开发入门 xff0c TF坐标系广播与监听的编程 小乌龟仿真中有2只乌龟 xff0c 键盘控制第1只乌龟走动 xff0c 2只乌龟都都广播自己的坐标 监听器听取2个乌龟的坐标 xf
  • 计算机保研面试常见问题(408数据结构简答题)

    1 什么是时间复杂度 xff1f O xff08 n xff09 的O代表了什么 xff1f 答 xff1a 时间复杂度是指执行算法所需要的计算工作量 xff0c 可以用于描述一个程序的规模 O xff08 n xff09 中的O表示的是最
  • 计算机保研面试常见问题(408操作系统简答题)

    1 操作系统的特点和功能是什么 xff1f 答 xff1a 操作系统的特点是并发 共享 虚拟 异步 其中 xff0c 并发和共享是操作系统主要的特点 操作系统的功能主要包括 xff1a 处理机管理 存储器管理 设备管理和文件管理等 操作系统
  • 计算机保研面试常见问题(408计算机网络简答题)

    1 能介绍一下OSI七层模型各层之间的功能与对应的协议吗 xff1f 答 xff1a OSI七层模型自底向上依次是 xff1a 物理层 数据链路层 网络层 运输层 会话层 表示层 应用层 各层的功能与相应的协议有 xff1a 物理层 xff
  • 从高考到程序员

    记得当年进入考场的时候也是志气满满 xff0c 心里念叨着一定要考上自己理想的大学 xff0c 光宗耀祖 当时坐在学校安排的bus上向考场的方向行进 xff0c 看到路边的交警叔叔 xff0c 情不自禁的喊了一声 xff0c 交警大哥辛苦了
  • 【姿态估计】Pose estimation algorithm 之 Robust Planar Pose (RPP)algorithm

    The RPP algorithm gives a more stable tracking less jitter than ARToolKit 39 s pose estimation algorithm The robust pose
  • STM32中,关于中断函数调用全局变量的问题

    本人菜鸟小白一枚 xff0c 第一次记录自己在学习中遇到的问题 xff0c 也当是与各位交流交流 首先是问题的描述 xff1a 硬件单片机型号 xff0c STM32F103VET6 xff0c IDE xff1a keil 5 想通过它实
  • 关于FreeRTOS操作系统遇到的一些小问题

    1 故障描述 今天在学习FreeRTOS操作系统关于计数量信号实验这一块的时候遇到了一个非常有意思的实验现象 就是程序任务的启动流程都是设置正确的 xff0c 但是两任务会有一个任务进不去 程序代码如下 include 34 bsp con