找回密码
 立即注册
查看: 30|回复: 3

移植CosyOS-III到AI8051U的32位模式下跑两个简单任务例程

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-28 15:28:39
已绑定手机

3

主题

6

回帖

59

积分

注册会员

积分
59
发表于 3 天前 | 显示全部楼层 |阅读模式
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上。移植过程中要注意几个地方。
截图202504281521483108.jpg


截图202504281524019953.jpg
截图202504281524316043.jpg

在内核的头文件上可以选择配置,需要和创建的项对应上

在内核的头文件上可以选择配置,需要和创建的项对应上

AI8051U32BIT COSYOS.rar

1.32 MB, 下载次数: 0

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 3 天前 | 显示全部楼层
移植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上。具体实现如下:
  1. c
  2. define TASKSTACKSIZE 1024
  3. xdata uint8t Task1Stack[TASKSTACKSIZE];
  4. xdata uint8t Task2Stack[TASKSTACKSIZE];
复制代码

3.3 端口适配

在Port.c文件中,需要根据AI8051U的硬件特性进行适配。主要包括以下几个方面:
中断向量表:根据AI8051U的中断向量表,修改相应的中断服务程序入口地址。
时钟配置:根据AI8051U的时钟频率,配置系统时钟节拍。
栈指针初始化:在任务创建时,初始化任务栈指针。

3.4 系统初始化

在System.c文件中,进行系统初始化,包括任务管理、时间管理等模块的初始化。具体实现如下:
  1. c
  2. void SystemInit(void) {
  3.     OSInit();  // 初始化RTOS
  4.     OSTaskCreate(Task1, NULL, &Task1Stack[TASKSTACKSIZE - 1], 1);  // 创建任务1
  5.     OSTaskCreate(Task2, NULL, &Task2Stack[TASKSTACKSIZE - 1], 2);  // 创建任务2
  6.     OSStart();  // 启动RTOS
  7. }
复制代码

4. 任务例程

本文运行了两个简单的任务,分别用于LED闪烁和串口输出。具体实现如下:

4.1 任务1:LED闪烁
  1. c
  2. void Task1(void pdata) {
  3.     while (1) {
  4.         LEDON();  // 点亮LED
  5.         OSTimeDly(500);  // 延时500ms
  6.         LEDOFF();  // 熄灭LED
  7.         OSTimeDly(500);  // 延时500ms
  8.     }
  9. }
复制代码

4.2 任务2:串口输出
  1. c
  2. void Task2(void pdata) {
  3.     while (1) {
  4.         UARTSendString("Hello, AI8051U!\r\n");  // 串口输出字符串
  5.         OSTimeDly(1000);  // 延时1000ms
  6.     }
  7. }
复制代码

5. 注意事项

在移植过程中,需要注意以下几个关键点:
栈空间分配:确保任务栈空间足够大,避免栈溢出。
中断处理:正确配置中断向量表,确保中断服务程序能够正常执行。
时钟配置:根据实际需求,合理配置系统时钟节拍,确保任务调度准确。

6. 结论

本文成功将CosyOS-III移植到AI8051U的32位模式下,并运行了两个简单的任务。通过合理利用AI8051U的硬件资源,充分发挥了RTOS的性能优势。本文为有兴趣的开发者提供了详细的移植过程和注意事项,希望能够为相关开发工作提供参考。

参考文献

[1] 迟凯峰. CosyOS-III用户手册. 2023.
[2] AI8051U数据手册. 2023.
[3] KEIL251用户手册. 2023.

附录



[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-28 15:28:39
已绑定手机

3

主题

6

回帖

59

积分

注册会员

积分
59
发表于 3 天前 | 显示全部楼层

#include "task.h"
#include "Devconfig.h"



#define TASK_A_PRI  1  
#define TASK_B_PRI  1

#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打印任务信息。




截图202504281537455517.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-28 15:28:39
已绑定手机

3

主题

6

回帖

59

积分

注册会员

积分
59
发表于 3 天前 | 显示全部楼层
jrh20*** 发表于 2025-4-28 15:36
#include "task.h"
#include "Devconfig.h"

注意,INT0中断被系统使用,因此不能用于外部中断。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 22:08 , Processed in 0.121311 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表