尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
FreeRTOS(7):时间片管理函数
实验现象使用串口助手在串口助手下实现如下图所示笔者的延时函数好像有一点问题现象应该是task1打印4次后切换到task2打印4次如此循环但是笔者task1和2的打印次数都不对但也算勉强体现出了想要结果若有解决方法可以在评论区写出或者私信笔者。创建工程选择上一个实验的Freertos_列表项的插入与删除复制粘贴重命名为Freertos_时间片调度实验打开别的江协科技的项目选择System文件复制其中的Delay.c和Delay.h文件粘贴到Freertos_时间片调度实验的Hardware文件夹中。编写代码进入keil按照下图顺序添加Delay.c和Delay.h文件添加完成后进入Delay.c文件因为江协科技的Delay函数使用了滴答计时器来实现延时与FreeRTOS的冲突了所以我们要更改一下笔者使用的是TIM4定时器如果有别的可以实现该实验功能的方法可以在评论区或者私信笔者下方是我的delay函数的代码#include stm32f10x.h #define TIM_DELAY TIM4 #define TIM_DELAY_CLK 72000000 /* 72MHz */ static uint8_t tim_delay_initialized 0; static void TIM_Delay_Init(void) { if (tim_delay_initialized) return; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Prescaler (TIM_DELAY_CLK / 1000000) - 1; // 1 MHz TIM_InitStruct.TIM_Period 0xFFFF; TIM_InitStruct.TIM_ClockDivision TIM_CKD_DIV1; TIM_InitStruct.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM_DELAY, TIM_InitStruct); TIM_Cmd(TIM_DELAY, ENABLE); tim_delay_initialized 1; } void Delay_us(uint32_t xus) { if (xus 0) return; TIM_Delay_Init(); TIM_SetCounter(TIM_DELAY, 0); while (TIM_GetCounter(TIM_DELAY) xus); } void Delay_ms(uint32_t xms) { while (xms--) { Delay_us(1000); } } void Delay_s(uint32_t xs) { while (xs--) { Delay_ms(1000); } }然后需要将Timer.c 中的中断函数中的内容和函数头上队列句柄删除如不删除会发生报错删除内容如下图所示随后我们要去到FreeRTOSConfig.h文件中将下图所示的宏定义改为20hz既一个时间片的时间为50ms接下来就是修改FreeRTOS_Task函数中的内容首先删除上一个实验与这个实验无关的内容如列表参数task1函数内的内容task2函数内的内容等下方是修改后的FreeRTOS_Task的代码#include stm32f10x.h #include FreeRTOS.h #include task.h #include queue.h #include led.h #include key.h #include serial.h #include timer.h #include delay.h /* 任务参数 */ #define START_TASK_SIZE 128 #define START_TASK_PRIO 1 #define TASK1_SIZE 256 #define TASK1_PRIO 3 #define TASK2_SIZE 256 #define TASK2_PRIO 3 /* 任务句柄 */ TaskHandle_t start_task_handle; TaskHandle_t task1_handle; TaskHandle_t task2_handle; void Start_task(void *pvParameters); void task_1(void *pvParameters); void task_2(void *pvParameters); void FreeRTOS_Task(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); Key_Init(); LED_Init(); Serial_Init(); xTaskCreate((TaskFunction_t)Start_task, Start_task, START_TASK_SIZE, NULL, START_TASK_PRIO, start_task_handle); vTaskStartScheduler(); } void Start_task(void *pvParameters) { taskENTER_CRITICAL(); xTaskCreate((TaskFunction_t)task_1, task_1, TASK1_SIZE, NULL, TASK1_PRIO, task1_handle); xTaskCreate((TaskFunction_t)task_2, task_2, TASK2_SIZE, NULL, TASK2_PRIO, task2_handle); taskEXIT_CRITICAL(); vTaskDelete(NULL); } /* * task_1 在一个时间片内每隔 10ms 打印一次计数连续运行直至被切换 */ void task_1(void *pvParameters) { uint32_t Task1_Num 0; while (1) { taskENTER_CRITICAL(); Task1_Num; Serial_Sendstring(Task1_Num ); Serial_SendNum(Task1_Num, 5); Serial_Sendstring(\r\n); taskEXIT_CRITICAL(); Delay_ms(10); /* 轮询忙等 10ms不释放 CPU */ } } /* * task_2 在一个时间片内每隔 10ms 打印一次计数连续运行直至被切换 */ void task_2(void *pvParameters) { uint32_t Task2_Num 0; while (1) { taskENTER_CRITICAL(); Task2_Num; Serial_Sendstring(Task2_Num ); Serial_SendNum(Task2_Num, 5); Serial_Sendstring(\r\n); taskEXIT_CRITICAL(); Delay_ms(10); /* 轮询忙等 10ms不释放 CPU */ } }随后运行下载代码后就能在串口助手里看见现象了再说一次笔者的延时函数好像有一点问题现象有误若有解决方法可以私信或者在评论区内指出。
RELATED

相关推荐

NBTExplorer终极指南:3步轻松掌握《我的世界》数据编辑神器

NBTExplorer终极指南:3步轻松掌握《我的世界》数据编辑神器

NBTExplorer终极指南:3步轻松掌握《我的世界》数据编辑神器 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否曾经因为《我的世界》存档损坏而束手…

📅 2026/9/11 14:36:10
西门子200smart模拟量滤波防抖PLC程序132(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

西门子200smart模拟量滤波防抖PLC程序132(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

西门子200smart模拟量滤波防抖PLC程序132(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 能实现电流电压和热电阻模拟量信号的采集,有滤波,有高位和低位报警, 采用for循环指令和间接寻址,让程序简…

📅 2026/9/15 19:25:00
react-native-meteor用户认证全攻略:登录、注销与安全最佳实践

react-native-meteor用户认证全攻略:登录、注销与安全最佳实践

react-native-meteor用户认证全攻略:登录、注销与安全最佳实践 【免费下载链接】react-native-meteor Meteor Reactivity for your React Native application :) 项目地址: https://gitcode.com/gh_mirrors/re/react-native-meteor react-native-meteor是一个…

📅 2026/9/14 12:24:43
MORE NEWS

更多资讯

📰

Pandoc fenced_divs 扩展实战:用 `:::` 围栏语法编写可嵌套、带属性的 Div 块

Pandoc fenced_divs 扩展实战:用 ::: 围栏语法编写可嵌套、带属性的 Div 块 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 导读 fenced_divs 是 Pandoc Markdown 中一个非常实用的扩展&#xff…

📰

PyPTO Tensor.topk 算子详解:在 CANN 昇腾平台上获取前 k 个最值及其索引

PyPTO Tensor.topk 算子详解:在 CANN 昇腾平台上获取前 k 个最值及其索引 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 本文围绕 …

📰

Rust 打造 OpenObserve:替代 Elasticsearch 和 Prometheus 的可观测性实战

1. 为什么我又把日志和指标系统折腾了一遍如果你运维过中等规模的线上环境,大概率经历过这样的场景:Elasticsearch 集群的 JVM 堆内存三天两头告警,Prometheus 的 TSDB 在高峰期写入延迟飙升,Grafana 面板加载慢得让人想砸键盘。更…

📰

SchoolDB空表填充指南:外键约束、事务提交与数据验证实战

1. 项目概述:一个只有空表的数据库,到底意味着什么做数据库课程设计时拿到“SchoolDB数据库的4张表——无数据”这个题目,第一次接触的人多半会愣一下:建好了库,建好了4张表,但表里一条记录都没有&#xff…

📰

Windows局域网共享访问被拒绝的底层原因与实战修复

1. 这个报错到底在说什么?——从一句提示看透Windows局域网共享的底层逻辑“您没有权限访问\192.168.1.X,请与网络管理员联系请求访问权限”——这行红色弹窗,几乎每个在办公室、家庭小网络或实验室里折腾过文件共享的Windows用户都见过。它不…

📰

使用 Fleet GitOps 部署 Santa 并彻底告别 Sync Server

使用 Fleet GitOps 部署 Santa 并彻底告别 Sync Server 【免费下载链接】fleet Open device management 项目地址: https://gitcode.com/GitHub_Trending/fl/fleet Santa 是面向 macOS 的二进制授权(binary authorization)系统,能够让…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬