移植CosyOS-III到AI8051U的32位模式下跑两个简单任务例程
CosyOS是迟凯峰老师发布的可用于8051的RTOS,目前已更新到CosyOS-III,本文基于AI8051U的32位模式,采用KEIL251开发工具,用CosyOS-III跑了两个简单的任务。AI8051U的RAM达到到34K,为了发挥其性能,需要跑RTOS,本例子从迟凯峰老师发布的CosyOS-III,从STC32G12K128移植到AI8051U,并得到迟老师的指点。为有兴趣的小伙伴做一个参考。RTOS的核心文件为HOOK,Port,System。
由于AI8051U有高达32K的XDATA,故将任务栈空间放在XDATA上。移植过程中要注意几个地方。
移植CosyOS-III到AI8051U的32位模式下跑两个简单任务例程
引言
CosyOS-III是由迟凯峰老师发布的一款适用于8051架构的实时操作系统(RTOS),目前已更新至CosyOS-III版本。本文基于AI8051U的32位模式,采用KEIL251开发工具,成功将CosyOS-III移植到AI8051U,并运行了两个简单的任务。AI8051U的RAM容量高达34K,为了充分发挥其性能,运行RTOS是一个理想的选择。本文将从移植过程、关键点及注意事项等方面进行详细阐述,为有兴趣的开发者提供参考。
1. 硬件平台与开发工具
1.1 AI8051U简介
AI8051U是一款高性能的8051架构微控制器,具备32位模式,RAM容量高达34K,其中XDATA空间为32K。其强大的硬件资源为运行RTOS提供了良好的基础。
1.2 开发工具
本文采用KEIL251作为开发工具,KEIL251是一款广泛使用的8051开发环境,支持C语言编程,具备强大的调试功能。
2. CosyOS-III简介
CosyOS-III是一款轻量级的RTOS,专为8051架构设计,具备任务管理、时间管理、信号量、消息队列等基本功能。其核心文件包括HOOK、Port和System,分别用于钩子函数、端口适配和系统管理。
3. 移植过程
3.1 移植准备
首先,从迟凯峰老师发布的CosyOS-III源码中获取核心文件,包括HOOK.c、Port.c和System.c。这些文件是RTOS的核心,需要根据AI8051U的硬件特性进行适配。
3.2 任务栈空间分配
由于AI8051U具备32K的XDATA空间,为了充分利用这一资源,将任务栈空间分配在XDATA上。具体实现如下:
c
define TASKSTACKSIZE 1024
xdata uint8t Task1Stack;
xdata uint8t Task2Stack;
3.3 端口适配
在Port.c文件中,需要根据AI8051U的硬件特性进行适配。主要包括以下几个方面:
中断向量表:根据AI8051U的中断向量表,修改相应的中断服务程序入口地址。
时钟配置:根据AI8051U的时钟频率,配置系统时钟节拍。
栈指针初始化:在任务创建时,初始化任务栈指针。
3.4 系统初始化
在System.c文件中,进行系统初始化,包括任务管理、时间管理等模块的初始化。具体实现如下:
c
void SystemInit(void) {
OSInit();// 初始化RTOS
OSTaskCreate(Task1, NULL, &Task1Stack, 1);// 创建任务1
OSTaskCreate(Task2, NULL, &Task2Stack, 2);// 创建任务2
OSStart();// 启动RTOS
}
4. 任务例程
本文运行了两个简单的任务,分别用于LED闪烁和串口输出。具体实现如下:
4.1 任务1:LED闪烁
c
void Task1(void pdata) {
while (1) {
LEDON();// 点亮LED
OSTimeDly(500);// 延时500ms
LEDOFF();// 熄灭LED
OSTimeDly(500);// 延时500ms
}
}
4.2 任务2:串口输出
c
void Task2(void pdata) {
while (1) {
UARTSendString("Hello, AI8051U!\r\n");// 串口输出字符串
OSTimeDly(1000);// 延时1000ms
}
}
5. 注意事项
在移植过程中,需要注意以下几个关键点:
栈空间分配:确保任务栈空间足够大,避免栈溢出。
中断处理:正确配置中断向量表,确保中断服务程序能够正常执行。
时钟配置:根据实际需求,合理配置系统时钟节拍,确保任务调度准确。
6. 结论
本文成功将CosyOS-III移植到AI8051U的32位模式下,并运行了两个简单的任务。通过合理利用AI8051U的硬件资源,充分发挥了RTOS的性能优势。本文为有兴趣的开发者提供了详细的移植过程和注意事项,希望能够为相关开发工作提供参考。
参考文献
迟凯峰. CosyOS-III用户手册. 2023.
AI8051U数据手册. 2023.
KEIL251用户手册. 2023.
附录
[本文内容由国芯人工智能辅助生成,仅供参考]
#include "task.h"
#include "Devconfig.h"
#define TASK_A_PRI1
#define TASK_B_PRI1
#define TASK_A_STACK 128
#define TASK_B_STACK 128
/* 启动钩子 */
void start_hook(void)
{
uStartTask(TASK_A, OS_STATUS_READY); // 启动 TASK_A
uStartTask(TASK_B, OS_STATUS_READY); // 启动 TASK_B
}
//-------------------------------------------------------------------------------------
/* 创建 TASK_CHECK_CAT1 */
uCreateTask(TASK_A, TASK_A_PRI, TASK_A_STACK , 0, 0)
{
while(1)
{
if(devstate.cat1_work_flag == 0) //检查是不是为0
{
printf("runing TASK_A\n");
uDelay_ms(100);
}
}
}
//------------------------------------------------------------------------------------
/* 创建 TASK_B */
uCreateTask(TASK_B, TASK_B_PRI, TASK_B_STACK , 0, 0)
{
P5M0 |= 0x01; P5M1 &= ~0x01;
while(1)
{
P50 = !P50;
printf("runing TASK_B\n");
uDelay_ms(500);
}
}
创建两任务,分别在100mS和500mS打印任务信息。
jrh200310 发表于 2025-4-28 15:36
#include "task.h"
#include "Devconfig.h"
注意,INT0中断被系统使用,因此不能用于外部中断。
页:
[1]