关于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操作系统遇到的一些小问题 的相关文章

  • 心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)

    文章目录 前言 介绍 系统框架 原项目地址 本项目开发开源地址 硬件PCB 软件功能 详细内容 硬件外壳制作 WS2812级联及控制 MAX30102血氧传感器 0 96OLED FreeRTOS 效果视频 总结 前言 在好几年前 我好像就
  • 基于HAL库的FREERTOS----------二.任务API函数

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

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • FreeRTOS基础五:软件定时器

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

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • FreeRTOS笔记(十)中断

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

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • FreeRTOS多任务调度器基础

    Cortex M4中SysTick调度器核心 Cortex M4中的中断管理 Cortex M4中影子栈指针 Cortex M4中SVC和PendSV异常 1 Cortex M4中SysTick调度器核心 systick每一次中断都会触发内
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • 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