找回密码
 立即注册
楼主: Cos***

RTOS 教学视频回放:全局不关总中断的CosyOS for STC

 火... [复制链接]

该用户从未签到

0

主题

3

回帖

26

积分

新手上路

积分
26
发表于 2024-4-17 16:29:47 | 显示全部楼层
盖楼了
回复 送花

使用道具 举报

  • TA的每日心情

    4 小时前
  • 签到天数: 58 天

    [LV.5]常住居民I

    3

    主题

    538

    回帖

    712

    积分

    高级会员

    积分
    712
    发表于 2024-4-17 16:33:17 | 显示全部楼层
    估计还要段时间啊
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:54
  • 签到天数: 70 天

    [LV.6]常住居民II

    8

    主题

    31

    回帖

    908

    积分

    高级会员

    积分
    908
    发表于 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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    487

    回帖

    2110

    积分

    荣誉版主

    积分
    2110
     楼主| 发表于 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配置文件必然需要配置;

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

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



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 48 天

    [LV.5]常住居民I

    8

    主题

    74

    回帖

    400

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    前天 10:44
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    0

    主题

    3

    回帖

    262

    积分

    中级会员

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

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    0

    主题

    26

    回帖

    310

    积分

    中级会员

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

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    回帖

    20

    积分

    新手上路

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

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 57 天

    [LV.5]常住居民I

    14

    主题

    29

    回帖

    736

    积分

    高级会员

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

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

    使用道具 举报

  • TA的每日心情

    4 小时前
  • 签到天数: 58 天

    [LV.5]常住居民I

    3

    主题

    538

    回帖

    712

    积分

    高级会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-2 13:51 , Processed in 0.073180 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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