一束光的旅程
发表于 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
期待大神视频课程