完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
由于项目需求,需要使用FREERTOS搭载轻量系统,因此写此博客给大家提供一个快速搭建RTOS系统的方法,通过cubemx快速生成。 FreeRTOS 简介 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。 任务调度机制是嵌入式实时操作系统的一个重要概念,也是其核心技术。对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU使用权,提高了系统的实时响应能力。不同于μC/OS-II,FreeRTOS对系统任务的数量没有限制,既支持优先级调度算法也支持轮换调度算法,因此FreeRTOS采用双向链表而不是采用查任务就绪表的方法来进行任务调度。 程序框图 所需要的元器件
stm32通过FREERTOS创建2个任务,而每个任务分别控制自己的LED灯闪烁,实现多任务处理。LED灯通过拉高点亮,拉低熄灭,通过程序语句HAL_GPIO_WritePin(GPIOF, LED0_Pin, GPIO_PIN_RESET)与HAL_GPIO_WritePin(GPIOF, LED0_Pin, GPIO_PIN_SET)来控制拉高和拉低。而HAL_Delay() 实现延迟效果,故可以看到灯闪烁。设置两个标志位VALUE1、VALUE2来控制2个LED灯闪烁的间隔,同时分别在两个任务中创建一个按键,通过HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0,检测按键口电位的高低,改变标志位的值,从而分别使两个灯按照预定延时规律闪烁切换。 接线方式
在 main.h 内宏定义3个LED的拉高拉低操作 #define led3_off HAL_GPIO_WritePin(GPIOG, LED3_Pin, GPIO_PIN_RESET) #define led3_on HAL_GPIO_WritePin(GPIOG, LED3_Pin, GPIO_PIN_SET) #define led2_off HAL_GPIO_WritePin(GPIOG, LED2_Pin, GPIO_PIN_RESET) #define led2_on HAL_GPIO_WritePin(GPIOG, LED2_Pin, GPIO_PIN_SET) #define led1_off HAL_GPIO_WritePin(GPIOG, LED1_Pin, GPIO_PIN_RESET) #define led1_on HAL_GPIO_WritePin(GPIOG, LED1_Pin, GPIO_PIN_SET) 在 freertos.c 内进行默认任务的编写,为LED1闪烁 void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ for(;;) { ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501130250901.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yYWluX0dBR0E=,size_16,color_FFFFFF,t_70) led1_on; osDelay(500); led1_off; osDelay(500); } /* USER CODE END StartDefaultTask */ } 第二个任务为LED2闪烁 void StartTask02(void const * argument) { /* USER CODE BEGIN StartTask02 */ /* Infinite loop */ for(;;) { led2_on; osDelay(500); led2_off; osDelay(500); } /* USER CODE END StartTask02 */ } 第三个任务为LED3闪烁 void StartTask03(void const * argument) { /* USER CODE BEGIN StartTask03 */ /* Infinite loop */ for(;;) { led3_on; osDelay(500); led3_off; osDelay(500); }
总结 使用嵌入式操作系统编程的优缺点:感觉FREERTOS最大的好处是多任务处理,曾经以前做比赛的时候,我们写代码一般都是放在while循环里,常常要多个任务放在一起,因此任务执行有先后顺序,这样效率不高。通过操作系统,可以实现循迹和避障一起执行的效果,所以总体来说效率提升了不少。但是FREERTOS本身也会占用系统内存,因此需要的时候打开就行了。程序设计时,也要考虑设计的效率,若一个办法可以更快的运行,则可以采用这种方法提高运行整体效果。 坚持成就梦想。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1804 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1097 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
736 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1686 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
748浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
583浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 23:31 , Processed in 0.772587 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号