引言
在嵌入式开发中,MCU(微控制器单元)的应用非常广泛,尤其是在资源受限的环境中,如何高效地管理任务、降低功耗、简化调试流程成为了开发者们关注的焦点。今天,我们要介绍的是一个无OS的MCU实用软件框架——CodeBrick,它通过模块化设计和自定义段技术,大大提升了代码的可维护性和开发效率。
CodeBrick框架简介
CodeBrick是一个专为无操作系统的MCU设计的实用软件框架,包含了任务轮询管理、命令管理器、低功耗管理、环形缓冲区等实用模块。它的核心思想是通过模块化设计,减少各个模块之间的耦合,使得代码更加清晰、易于维护。
主要功能
-
模块自动化管理:支持不同优先级的初始化接口,模块化管理更加灵活。
-
任务轮询管理:通过简单的宏声明即可实现任务轮询,无需复杂的调用。
-
低功耗管理:支持休眠与唤醒通知,有效降低系统功耗。
-
命令行解析:支持命令注册与执行,方便在线调试和参数配置。
-
Blink设备支持:统一管理LED、震动马达、蜂鸣器等具有闪烁特性的设备。
使用说明
CodeBrick框架的开发平台基于STM32F401RET6 MCU,支持IAR 7.4和Keil MDK 4.72A IDE。下面我们将详细介绍如何使用CodeBrick框架进行开发。
任务初始化及任务轮询管理
在使用CodeBrick框架时,首先需要系统提供滴答定时器,用于驱动任务轮询作业。通过简单的宏声明,即可实现任务的初始化和轮询管理。
// 定时器中断(提供系统滴答)
void SysTick_Handler(void)
{
systick_increase(SYS_TICK_INTERVAL); // 增加系统节拍
}
// 注册初始化入口及任务
static void key_init(void)
{
/*do something*/
}
static void key_scan(void)
{
/*do something*/
}
module_init("key", key_init); // 注册按键初始化接口
driver_register("key", key_scan, 20); // 注册按键任务(20ms轮询1次)
命令管理器(CLI)
CodeBrick框架内置了命令行解析功能,用户可以通过串口输出命令行控制设备行为、查询设备状态等。系统默认提供了两条命令:?
和help
,用于列出当前系统包含的命令列表。
// 命令行任务初始化
static void cli_task_init(void)
{
cli_port_t p = {tty.write, tty.read}; // 读写接口
cli_init(&cli, &p); // 初始化命令行对象
cli_enable(&cli);
cli_exec_cmd(&cli,"sysinfo"); // 显示系统信息
}
// 命令行任务处理
static void cli_task_process(void)
{
cli_process(&cli);
}
module_init("cli", cli_task_init);
task_register("cli", cli_task_process, 10); // 注册命令行任务
低功耗管理器(PM)
CodeBrick框架支持低功耗管理,通过轮询系统中各个模块是否可以允许系统进入低功耗状态。所有模块都具有“一票否决权”,即只要有一个模块不允许休眠,系统就不会进入休眠状态。
// 低功耗适配器
typedef struct {
unsigned int max_sleep_time; // 系统最大休眠时长(ms)
unsigned int (*goto_sleep)(unsigned int time); // 进入休眠状态
} pm_adapter_t;
void pm_init(const pm_adapter_t *adt);
void pm_enable(void);
void pm_disable(void);
void pm_process(void);
Blink模块
Blink模块
Blink模块用于管理具有闪烁特性的设备,如LED、震动马达、蜂鸣器等。通过简单的接口调用,即可实现设备的闪烁控制。
// LED驱动
blink_dev_t led; // 定义led设备
static void led_ctrl(int on)
{
if (on)
GPIOA->ODR |= (1 << 8);
else
GPIOA->ODR &= ~(1 << 8);
}
void led_init(void)
{
led_io_init(void); // led io初始化
blink_dev_create(&led, led_ctrl); // 创建led设备
blink_dev_ctrl(&led, 50, 100, 0); // 快闪(50ms亮, 100ms灭)
}
按键管理模块
按键管理模块通过系统滴答时钟和任务轮询,实现了按键的短按、长按等事件的处理。
key_t key; // 定义按键管理器
void key_event(int type, unsigned int duration)
{
if (type == KEY_PRESS) { // 短按
} else if (type == KEY_LONG_DOWN) { // 长按
}
}
int read_key(void)
{
return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == Bit_RESET;
}
void key_init(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
gpio_conf(GPIOA, GPIO_Mode_IN, GPIO_PuPd_NOPULL, GPIO_Pin_8);
key_create(&key, read_key, key_event); // 创建1个按键
}
CodeBrick框架通过模块化设计和自定义段技术,极大地简化了无OS的MCU开发流程。无论是任务管理、低功耗控制,还是命令行调试,CodeBrick都提供了简洁高效的解决方案。如果你正在寻找一个能够提升开发效率的MCU框架,不妨试试CodeBrick,相信它会为你的嵌入式开发带来全新的体验!
关注我,获取更多嵌入式开发干货!如果你有任何问题或建议,欢迎在评论区留言,我们会尽快回复你!