新手上路
- 积分
- 23
- 金钱
- 23
- 注册时间
- 2022-3-31
- 在线时间
- 6 小时
|
3金钱
各位大佬,小弟在把之前不是在UCOS系统下编写的485通信代码,放在基于UCOS的MQTT通信工程中,发现用任务管理无法正常调用。如果直接放在main函数里裸跑,可以运行一次。请教是什么原因。代码如下:
int main(void)
{
delay_init(168); //延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
uart_init(115200); //串口波特率设置
//LED_Init(); //LED初始化
KEY_Init(); //按键初始化
LCD_Init(); //LCD初始化
RS485_init(115200); //RS485初始化;
W25QXX_Init(); //初始化W25Q128
FSMC_SRAM_Init(); //SRAM初始化
TIM5_Init(5000,8400-1); //定时器初始化
rs485_task(0x0001); //位置1
mymem_init(SRAMIN); //初始化内部内存池
mymem_init(SRAMEX); //初始化外部内存池
mymem_init(SRAMCCM); //初始化CCM内存池
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[0],"0:",1); //挂载SD卡
f_mount(fs[1],"1:",1); //挂载FLASH.
font_init();
POINT_COLOR = RED; //红色字体
LCD_ShowString(30,30,200,20,16,"Explorer STM32F4");
LCD_ShowString(30,50,200,20,16,"LWIP+UCOS Test");
LCD_ShowString(30,70,200,20,16,"ATOM@ALIENTEK");
LCD_ShowString(30,90,200,20,16,"2014/9/1");
// Show_Str(30,244,200,16,"对应汉字(16*16)为:",16,0);
OSInit(); //UCOS初始化
while(lwip_comm_init()) //lwip初始化
{
LCD_ShowString(30,110,200,20,16,"Lwip Init failed!"); //lwip初始化失败
delay_ms(500);
LCD_Fill(30,110,230,150,WHITE);
delay_ms(500);
}
LCD_ShowString(30,110,200,20,16,"Lwip Init Success!"); //lwip初始化成功
OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);
OSStart(); //开启UCOS
}
//start任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr;
pdata = pdata ;
OSStatInit(); //初始化统计任务
OS_ENTER_CRITICAL(); //关中断
#if LWIP_DHCP
lwip_comm_dhcp_creat(); //创建DHCP任务
OSTimeDlyHMSM(0,0,2,500);
#endif
OSTaskCreate(led_task,(void*)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);//创建LED任务
OSTaskCreate(display_task,(void*)0,(OS_STK*)&DISPLAY_TASK_STK[DISPLAY_STK_SIZE-1],DISPLAY_TASK_PRIO); //显示任务
OSTaskCreate(mqtt_task,(void*)0,(OS_STK*)&mqtt_task_stk[mqtt_stk_size-1],mqtt_task_prio); //mqtt任务
OSTaskCreate(dht11_task,(void*)0,(OS_STK*)&dht11_task_stk[dht11_stk_size-1],dht11_task_prio); //mqtt任务
OSTaskSuspend(OS_PRIO_SELF); //挂起start_task任务
OS_EXIT_CRITICAL(); //开中断
}
//显示地址等信息
void display_task(void *pdata)
{
// OS_CPU_SR cpu_sr;
pdata = pdata ;
while(1)
{
#if LWIP_DHCP //当开启DHCP的时候
if(lwipdev.dhcpstatus != 0) //开启DHCP
{
show_address(lwipdev.dhcpstatus ); //显示地址信息
OSTaskSuspend(OS_PRIO_SELF); //显示完地址信息后挂起自身任务
}
#else
show_address(0); //显示静态地址
OSTaskSuspend(OS_PRIO_SELF); //显示完地址信息后挂起自身任务
#endif //LWIP_DHCP
OSTimeDlyHMSM(0,0,0,500);
}
}
//led任务
void led_task(void *pdata)
{
pdata = pdata ;
while(1)
{
LED0 = !LED0;
OSTimeDlyHMSM(0,0,0,500); //延时500ms
}
}
void mqtt_task(void *pdata)
{
pdata = pdata ;
while(1)
{
printf("\r\ncJSON Version: %s\r\n", cJSON_Version());
OSTimeDlyHMSM(0,0,0,50);
mqtt_thread();
OSTimeDlyHMSM(0,0,0,500); //
}
}
void dht11_task(void *pdata)
{
pdata = pdata ;
while(1)
{
rs485_task(0x0001);//位置2
OSTimeDlyHMSM(0,0,0,500); //
}
}
485串口监测的结果:在位置1可以正常运行一次,然后就是一堆乱码;放在位置2,开机一堆乱码就没有

|
|