FreeRTOS与裸机开发的区别
1. 任务管理
-
FreeRTOS:
- 提供多任务环境,允许同时运行多个任务。
- 通过任务调度器管理任务的切换和优先级。
- 开发者可以定义任务的优先级、堆栈大小等属性。
- 支持任务间通信(如队列、信号量和互斥锁)来协调任务之间的操作。
-
裸机开发:
- 通常只有一个主程序运行,任务切换需要手动实现。
- 没有内置的任务管理机制,所有操作需由开发者直接控制。
- 通常需要使用循环(如
while
循环)来处理多任务需求,或者使用定时器来实现时间片轮转。
2. 实时性
-
FreeRTOS:
- 设计用于实时应用,具有确定性的任务调度。
- 可以设置任务的优先级,以确保高优先级任务能及时响应。
-
裸机开发:
- 实时性取决于程序的设计,通常缺乏调度机制。
- 响应时间不够灵活,处理复杂情况时可能会出现延迟。
3. 代码结构
-
FreeRTOS:
- 代码结构通常较为复杂,涉及多个源文件和头文件。
- 提供丰富的API,可以大大简化任务管理和资源共享的实现。
-
裸机开发:
- 代码相对简单,通常在单一的文件中编写。
- 所有硬件控制和逻辑实现都由开发者自己管理,灵活性高。
4. 资源管理
-
FreeRTOS:
- 提供内存管理功能,支持动态内存分配(如使用
pvPortMalloc
和vPortFree
)。 - 可以方便地管理和分配各种资源,如任务、信号量、队列等。
- 提供内存管理功能,支持动态内存分配(如使用
-
裸机开发:
- 通常需要手动管理内存和资源分配。
- 开发者需要对内存使用有更深入的理解,避免内存泄漏和冲突。
5. 开发复杂性
-
FreeRTOS:
- 虽然可以减少管理复杂性的负担,但需要学习和理解RTOS的概念和API。
- 对于新手,可能需要一定的学习曲线来掌握实时系统的工作原理。
-
裸机开发:
- 开发相对简单,但当项目变得复杂时,管理多个任务和资源的难度会增加。
- 对于初学者来说,容易理解,但不适合复杂应用。
cubemx的基本配置:
RCC选用外部晶振High Speed Clock (HSE) Crystal/Ceramic Resonator
SYS这里Debug选择Serial Wire选着后可以多次下载,不勾选后续只能下载一次,Timebase Source 选择TIM4。
Clock Configuration将时钟开到最大
展开Middleware双击 FREERTOs对于Config parameters的基本配置根据项目需要进行修改,
Tasks and Queues可以在这添加多项任务
下一步配置LED和串口:
选择串口1,Mode选择Asynchronous异步串口通信,波特率设置为115200Bits/s
最后一步就是创建工程
在 usart.c文件下加入下列代码,#include "usart.h"文件下加入#include "stdio.h"
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,10);
return ch;
}
在freertos.c文件下添加以下代码
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
HAL_GPIO_WritePin (GPIOA,GPIO_PIN_8,GPIO_PIN_SET);
osDelay(100);
HAL_GPIO_WritePin (GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);
osDelay(100);
}
/* USER CODE END StartTask02 */
}
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
printf ("SS\r\n");
osDelay(100);
}
在运行代码之前要在魔术棒下勾选Use MicroLlB,不勾选串口不能发送数据。