找回密码
 立即注册
楼主: CosyOS

全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板

 火... [复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:384
  • 最近打卡:2025-05-04 07:47:57
已绑定手机

12

主题

43

回帖

710

积分

高级会员

积分
710
发表于 2024-4-17 16:37:13 | 显示全部楼层
支持。之前琢磨过楼主的程序,无奈水平太菜,还是处于迷惑状态:任务怎么创建还是没有搞明白。
之前使用keilc51自带的系统:创建的程序流程为在任务0中创建任务,然后在已创建的任务中进行模块化编程,比如以下程序。建议系统可否出一个精简板,可以更换一个头文件就可以c51和c251切换。

void Init_Task(void) _task_ 0
{
        GPIO_Init();
        ADC_config();
        Uart1Init();
        PCA_config();
        userled=0;
        os_create_task(1);//创建Modbus通信
        os_create_task(2);//创建Modbus超时检测
        os_create_task(3);//创建EEPROM 数据保存
        os_create_task(4);//创建温度湿度采集
        os_delete_task(0);//删除任务0
}
/***********Modbus通信解析***************************/

void Modbus_Parsing_Task(void) _task_ 1
{
        u8 i;
        for(i=0;i<64;i++)
        {
                modbus_reg[i]=0;
        }
       
        while(1)
        {       
                Modbus1_Parsing();
                os_wait(K_TMO,10,0);//moudbus轮询时间要短
        }
}

/***********Modbus通信超时处理***************************/

void Modbus_Timeout_Dispose(void) _task_ 2
{
        while(1)
        {       
                Modbus1_TimeOut_Check();
                os_wait(K_TMO,2,0);
        }
}

/***********站号设定并保存至EEPROM***************************/

void EEPROM_Read_Write(void) _task_ 3
{
        u8 EEPROM_Temp[1];
        EEPROM_read_n(0,EEPROM_Temp,1);//0x0000扇区,1个字节
        if(EEPROM_Temp[0]<255)
        {
                SL_ADDR=EEPROM_Temp[0];
        }
        else
        {
                SL_ADDR=4;
        }
       
        while(1)
        {       
                if(modbus_reg[0]==1)
                {
                       
                        EEPROM_SectorErase(0);
                        os_wait(K_TMO,2,0);
                        EEPROM_Temp[0]=modbus_reg[1];
                        EEPROM_write_n(0,EEPROM_Temp,1);
                        modbus_reg[1]=0;
                        modbus_reg[0]=0;
                       
                }
                else if(modbus_reg[0]==2)
                {
                        EEPROM_read_n(0,EEPROM_Temp,1);
                        SL_ADDR=EEPROM_Temp[0];
                        modbus_reg[0]=0;                       
                }
                modbus_reg[4]=SL_ADDR;
               

               
                os_wait(K_TMO,250,0);
               
                os_wait(K_TMO,250,0);
        }
}

/***********温湿度采集计算**************************/

void Humidity_Drive_1KHZ(void) _task_ 4
{                       
        int *BGA;
        while(1)
        {       
                BGA= (int idata *)0xef;
                Vbga=(float)(*BGA);

                mcu_vcc=1024.0*Vbga/bga_value;
                RH_value=(u32)(10*mcu_vcc/CH_voltage-10);
                res2humidity(RH_value);
                modbus_reg[5]=(u16)mcu_vcc;//基准电压
                modbus_reg[6]=(u16)CH_voltage;//
                modbus_reg[7]=HUMI_vule/10;//湿度
                os_wait(K_TMO,250,0);
                os_wait(K_TMO,250,0);
    userled=~userled;        
        }
}

点评

/***********初始化钩子***************************/ void init_hook(void) { GPIO_Init(); ADC_config(); Uart1Init(); PCA_config(); userled=0; // 这个灯在哪点亮  详情 回复 发表于 2024-4-17 19:48
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:434
  • 最近打卡:2025-05-03 16:06:50

5

主题

1127

回帖

4271

积分

荣誉版主

积分
4271
发表于 2024-4-17 19:48:29 | 显示全部楼层
本帖最后由 CosyOS 于 2024-4-18 08:24 编辑
一束光*** 发表于 2024-4-17 16:37
支持。之前琢磨过楼主的程序,无奈水平太菜,还是处于迷惑状态:任务怎么创建还是没有搞明白。
之前使用keil ...

/***********初始化钩子***************************/

void init_hook(void)
{
        GPIO_Init();
        ADC_config();
        Uart1Init();
        PCA_config();
        userled=0; // 这个灯在哪点亮都可以
}

/***********启动钩子***************************/

void start_hook(void)
{
        userled=0; // 这个灯在哪点亮都可以

        uStartTask(Modbus_Parsing_Task, 0);       // 启动Modbus通信任务
        uStartTask(Modbus_Timeout_Dispose, 0); // 启动Modbus超时检测任务
        uStartTask(EEPROM_Read_Write, 0);        // 启动EEPROM 数据保存任务
        uStartTask(Humidity_Drive_1KHZ, 0);       // 启动温度湿度采集任务

}

/***********Modbus通信解析***************************/

uCreateTask(Modbus_Parsing_Task, pri, stacksize, 0, 0)
{
        u8 i;
        for(i=0;i<64;i++)
        {
                modbus_reg=0;
        }
      
        while(1)
        {      
                Modbus1_Parsing();
                os_wait(K_TMO,10,0);//moudbus轮询时间要短
        }

        uEndTasking;
}

/***********Modbus通信超时处理***************************/

uCreateTask(Modbus_Timeout_Dispose, pri, stacksize, 0, 0)
{
        while(1)
        {      
                Modbus1_TimeOut_Check();
                os_wait(K_TMO,2,0);
        }

        uEndTasking;
}

/***********站号设定并保存至EEPROM***************************/

uCreateTask(EEPROM_Read_Write, pri, stacksize, 0, 0)
{
        u8 EEPROM_Temp[1];
        EEPROM_read_n(0,EEPROM_Temp,1);//0x0000扇区,1个字节
        if(EEPROM_Temp[0]<255)
        {
                SL_ADDR=EEPROM_Temp[0];
        }
        else
        {
                SL_ADDR=4;
        }
      
        while(1)
        {      
                if(modbus_reg[0]==1)
                {
                       
                        EEPROM_SectorErase(0);
                        os_wait(K_TMO,2,0);
                        EEPROM_Temp[0]=modbus_reg[1];
                        EEPROM_write_n(0,EEPROM_Temp,1);
                        modbus_reg[1]=0;
                        modbus_reg[0]=0;
                       
                }
                else if(modbus_reg[0]==2)
                {
                        EEPROM_read_n(0,EEPROM_Temp,1);
                        SL_ADDR=EEPROM_Temp[0];
                        modbus_reg[0]=0;                       
                }
                modbus_reg[4]=SL_ADDR;
               

               
                os_wait(K_TMO,250,0);
               
                os_wait(K_TMO,250,0);
        }

        uEndTasking;
}

/***********温湿度采集计算**************************/

uCreateTask(Humidity_Drive_1KHZ, pri, stacksize, 0, 0)
{                       
        int *BGA;
        while(1)
        {      
                BGA= (int idata *)0xef;
                Vbga=(float)(*BGA);

                mcu_vcc=1024.0*Vbga/bga_value;
                RH_value=(u32)(10*mcu_vcc/CH_voltage-10);
                res2humidity(RH_value);
                modbus_reg[5]=(u16)mcu_vcc;//基准电压
                modbus_reg[6]=(u16)CH_voltage;//
                modbus_reg[7]=HUMI_vule/10;//湿度
                os_wait(K_TMO,250,0);
                os_wait(K_TMO,250,0);
    userled=~userled;        
        }

        uEndTasking;
}


这样就可以了,我只是给你调整了一下框架,让你能把握流程。
其实,CosyOS创建任务是简单的,不要把他想复杂了,不要拘泥于固有思维。
然后就是系统配置、mcu配置,等相关配置了。

我再总结一下,CosyOS开发流程:
1、两个钩子 + 创建任务(uCreateTaskdCreateTask);
2、配置工程:系统配置 + MCU配置 + 编译器配置 + 启动文件配置 + ......

如果是不同MCU的切换:
首先要换一个标准头文件;
系统配置中要重新配置MCU内核和标准头文件;
相应的MCU配置文件必然需要配置;

启动钩子和所有任务基本是不需要动的;
初始化钩子一般也不需要动,取决于你;

其实并不复杂,做的都是该做的事。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-04-22 08:32:33

9

主题

76

回帖

537

积分

高级会员

积分
537
发表于 2024-4-18 22:55:51 | 显示全部楼层
Cos*** 发表于 2024-2-4 12:53
putchar用于printf的串口重定向,putchar中返回的c就是传入的c。至于为何要返回,我也不清楚。但由于keil ...

可以的,能正常运行,我试过了,把返回值修改成不返回任何值。只需要修改SBUF值或S2BUF就能完成重定向。

点评

你很有钻研精神,值得称赞!  发表于 2024-4-19 13:42
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:27
  • 最近打卡:2024-06-03 14:52:15

0

主题

3

回帖

384

积分

中级会员

积分
384
发表于 2024-4-19 09:00:29 | 显示全部楼层
盖楼,期待开课中。。。。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:182
  • 最近打卡:2025-04-30 08:33:07

0

主题

48

回帖

748

积分

高级会员

积分
748
发表于 2024-4-19 16:36:21 | 显示全部楼层
快到500了,继续
回复 支持 反对

使用道具 举报 送花

0

主题

3

回帖

20

积分

新手上路

积分
20
发表于 2024-4-19 16:37:33 | 显示全部楼层
期待大神课程
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:292
  • 最近打卡:2025-05-04 10:21:57

23

主题

65

回帖

1878

积分

金牌会员

积分
1878
发表于 2024-4-19 23:14:43 | 显示全部楼层
本帖最后由 深圳湾 于 2024-4-19 23:16 编辑

不明觉利,推一把先
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-04 00:16:27
已绑定手机

19

主题

3191

回帖

4930

积分

论坛元老

积分
4930
发表于 2024-4-19 23:19:06 | 显示全部楼层
很期待啊,快500了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:384
  • 最近打卡:2025-05-04 07:47:57
已绑定手机

12

主题

43

回帖

710

积分

高级会员

积分
710
发表于 2024-4-20 09:46:51 | 显示全部楼层
Cos*** 发表于 2024-4-17 19:48
/***********初始化钩子***************************/

void init_hook(void)

这两天夜里又耐心读了一下test中的代码,对比着您的回复,修改了一些代码。有些函数还是有些不是很懂,代码修修改改进行验证。总而言之,学习新的知识需要静下心来研究,之前还是太浮躁了。这两天还是有收获的,一些不懂的地方等我研究透彻了再向您请教。

点评

不懂可随时提问  发表于 2024-4-20 10:32
回复 支持 反对

使用道具 举报 送花

0

主题

3

回帖

20

积分

新手上路

积分
20
发表于 2024-4-20 17:42:49 | 显示全部楼层
期待大神视频课程
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-4 19:59 , Processed in 0.153002 second(s), 124 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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