OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4245|回复: 5

rs485_task在UCOS任务管理中调用异常

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2022-3-31
在线时间
6 小时
发表于 2022-4-22 10:15:10 | 显示全部楼层 |阅读模式
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,开机一堆乱码就没有

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2022-3-31
在线时间
6 小时
 楼主| 发表于 2022-4-25 15:29:52 | 显示全部楼层
求大神们帮忙解答一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-4-26 00:00:27 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2022-3-31
在线时间
6 小时
 楼主| 发表于 2022-4-27 11:32:57 | 显示全部楼层
排查了一下问题,是lwip_comm_dhcp_creat();任务存在的时候,就无法正常运行rs485_task,有知道原因的大神吗?lwip_comm_dhcp_creat()就是用的正点原子的标准例程代码
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2022-3-31
在线时间
6 小时
 楼主| 发表于 2022-4-29 14:39:12 | 显示全部楼层

请教一下原子哥,407探索者网口和RS485串口共用了PA2引脚,怎么解决呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-5-4 10:59:55 | 显示全部楼层
stm32studyer 发表于 2022-4-29 14:39
请教一下原子哥,407探索者网口和RS485串口共用了PA2引脚,怎么解决呢

不要同时用,或者换IO(改接线)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 18:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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