一束光的旅程 发表于 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=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;
        EEPROM_read_n(0,EEPROM_Temp,1);//0x0000扇区,1个字节
        if(EEPROM_Temp<255)
        {
                SL_ADDR=EEPROM_Temp;
        }
        else
        {
                SL_ADDR=4;
        }
       
        while(1)
        {       
                if(modbus_reg==1)
                {
                       
                        EEPROM_SectorErase(0);
                        os_wait(K_TMO,2,0);
                        EEPROM_Temp=modbus_reg;
                        EEPROM_write_n(0,EEPROM_Temp,1);
                        modbus_reg=0;
                        modbus_reg=0;
                       
                }
                else if(modbus_reg==2)
                {
                        EEPROM_read_n(0,EEPROM_Temp,1);
                        SL_ADDR=EEPROM_Temp;
                        modbus_reg=0;                       
                }
                modbus_reg=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=(u16)mcu_vcc;//基准电压
                modbus_reg=(u16)CH_voltage;//
                modbus_reg=HUMI_vule/10;//湿度
                os_wait(K_TMO,250,0);
                os_wait(K_TMO,250,0);
    userled=~userled;        
        }
}

CosyOS 发表于 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;
      EEPROM_read_n(0,EEPROM_Temp,1);//0x0000扇区,1个字节
      if(EEPROM_Temp<255)
      {
                SL_ADDR=EEPROM_Temp;
      }
      else
      {
                SL_ADDR=4;
      }
      
      while(1)
      {      
                if(modbus_reg==1)
                {
                     
                        EEPROM_SectorErase(0);
                        os_wait(K_TMO,2,0);
                        EEPROM_Temp=modbus_reg;
                        EEPROM_write_n(0,EEPROM_Temp,1);
                        modbus_reg=0;
                        modbus_reg=0;
                     
                }
                else if(modbus_reg==2)
                {
                        EEPROM_read_n(0,EEPROM_Temp,1);
                        SL_ADDR=EEPROM_Temp;
                        modbus_reg=0;                     
                }
                modbus_reg=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=(u16)mcu_vcc;//基准电压
                modbus_reg=(u16)CH_voltage;//
                modbus_reg=HUMI_vule/10;//湿度
                os_wait(K_TMO,250,0);
                os_wait(K_TMO,250,0);
    userled=~userled;      
      }
      uEndTasking;
}


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

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

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

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

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



JimOrange 发表于 2024-4-18 22:55:51

CosyOS 发表于 2024-2-4 12:53
putchar用于printf的串口重定向,putchar中返回的c就是传入的c。至于为何要返回,我也不清楚。但由于keil ...

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

apei0303 发表于 2024-4-19 09:00:29

盖楼,期待开课中。。。。

daybeen 发表于 2024-4-19 16:36:21

快到500了,继续

liuz2004 发表于 2024-4-19 16:37:33

期待大神课程{:smile:}

深圳湾 发表于 2024-4-19 23:14:43

本帖最后由 深圳湾 于 2024-4-19 23:16 编辑

不明觉利,推一把先

soma 发表于 2024-4-19 23:19:06

很期待啊,快500了

一束光的旅程 发表于 2024-4-20 09:46:51

CosyOS 发表于 2024-4-17 19:48
/***********初始化钩子***************************/

void init_hook(void)


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

liuz2004 发表于 2024-4-20 17:42:49

期待大神视频课程
页: 37 38 39 40 41 42 43 44 45 46 [47] 48 49 50 51 52 53 54 55 56
查看完整版本: 全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板