FreeRTOS工程的创建

  裸机设计和FreeRTOS的区别:裸机设计模式有四种分别是轮询模式(从代码上到下一句一句执行),前后台模式(通过设置中断函数来进行),定时器模式(通过设置定时器在定时时间下执行代码),基于状态机模式(将一段功能代码进行拆分执行)。FreeRTOS则是采用多任务模式进行代码的执行。下面我们来用stm32cubemx来创建一个含有FreeRTOS系统的文件:

  

点击软件进入开始界面,点击标记处创建新文件。

选择所需要的芯片参数,这里以stm32f103c8t6为例,选择后出现两款芯片参数,这里我们选择第一块芯片。

选择后我们来进行RCC的参数配置,我们第一个参数选择Cystal/cremic resonator,也就是使用外部晶振。

然后进行时钟频率调节,这里我们使用72mhz,所以要将8改成72。

我们在中间件中选中FREERTOS,选择最新的接口。

在选择了最新的接口后,需要调节一些参数我们这里先使用默认值,然后这里我们要将方框2中的第一项选中让文件能产生相应的.c和.h文件。

然后再在Project Manager选项卡中设置你所需的文件名和保存路径。并设置IDE为MDK-ARM也就是使用我们常用的嵌入式开发软件,然后点击右上角的创建文件。

最后创建完成后在所填路径中找到创建好的文件打开,点击编译没有错误即第一个FREERTOS工程创建完成。

### 梁山派开发板 FreeRTOS 配置方法 对于梁山派开发板,可以利用其集成的MDK-RTE功能来快速添加FreeRTOS组件。以下是具体的配置说明: 通过MDK-RTE工具,在项目设置界面中找到并勾选FreeRTOS组件即可完成初始化配置[^2]。需要注意的是,默认情况下 `FreeRTOSConfig.h` 文件可能启用了某些不必要的功能模块。这些未使用的功能可能会引发编译警告或错误。解决办法是定位到该头文件,并关闭暂不需用的功能选项。 #### 示例代码调整 假设已经完成了上述操作,则可以通过如下方式验证基本任务调度是否正常运行: ```c #include "FreeRTOS.h" #include "task.h" void vTaskFunction(void *pvParameters) { while (1) { // 执行任务逻辑 configASSERT(uxTaskGetNumberOfTasks() > 0); vTaskDelay(pdMS_TO_TICKS(500)); // 延迟500ms } } int main(void) { xTaskCreate(vTaskFunction, "Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); vTaskStartScheduler(); // 启动多任务调度器 for (;;); // 不应到达此处 } ``` --- ### 天空星 STM32F407VET6 版本 FreeRTOS 示例代码 针对天空星开发板(基于STM32F407芯片),创建一个简单的FreeRTOS工程通常涉及以下几个步骤: 1. **安装必要的软件环境** 使用官方推荐的Keil MDK或其他IDE建立基础工程框架。 2. **导入FreeRTOS库** 参考文档中的指引将FreeRTOS源码目录加入至工程路径下[^3]。 3. **编写测试程序** 下面提供一段用于验证的任务切换演示代码片段: ```c // 定义两个独立的任务函数原型声明 void TaskBlinkLED1(void* pvParameters); void TaskBlinkLED2(void* pvParameters); int main(void) { SystemInit(); // 创建第一个任务 xTaskCreate(TaskBlinkLED1, "LED1_TASK", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); // 创建第二个任务 xTaskCreate(TaskBlinkLED2, "LED2_TASK", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); // 开始执行实时操作系统内核管理下的各线程活动周期循环过程... vTaskStartScheduler(); return 0; // 正常退出点理论上不可达 } // 实现具体行为定义部分——交替点亮不同编号led灯泡模拟效果展示用途而已哦~ void TaskBlinkLED1(void* pvParameters) { TickType_t lastWakeTime = xTaskGetTickCount(); const TickType_t delayPeriod = pdMS_TO_TICKS(1000UL / portTICK_PERIOD_MS); GPIO_InitTypeDef LED_Pin; __HAL_RCC_GPIOA_CLK_ENABLE(); // 替换实际端口使能语句 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, RESET); // 初始化状态设低电平熄灭初始态 while(true){ HAL_Delay(250); HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); vTaskDelayUntil(&lastWakeTime,delayPeriod); } } void TaskBlinkLED2(void* pvParameters) { TickType_t lastWakeTime = xTaskGetTickCount(); const TickType_t delayPeriod = pdMS_TO_TICKS(1000UL / portTICK_PERIOD_MS); GPIO_InitTypeDef LED_Pin; __HAL_RCC_GPIOB_CLK_ENABLE(); // 替换实际端口使能语句 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, SET); // 初始高亮显示区别于另一盏灯具对象实例化表达形式上有所差异罢了哈~ while(true){ HAL_Delay(500); HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); vTaskDelayUntil(&lastWakeTime,delayPeriod); } } ``` 此段脚本展示了如何分别控制两组不同的硬件资源按照预设计时间间隔规律闪烁动作现象呈现给观察者视觉感官体验感受啦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值