OpenEdv-开源电子网

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

ucosiii的时间片打印输出出现问题

[复制链接]

1

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-6-17
在线时间
11 小时
发表于 2021-5-27 23:51:18 | 显示全部楼层 |阅读模式
1金钱
因为我没有使用LCD屏,就把LCD屏的代码注释了,可一注释就出现了问题
当不注释LCD代码则没问题

其中注释的代码如下,请问有大神知道这是怎么回事吗?为什么LCD代码
会影响打印输出呢?

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

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
771
金钱
771
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-5-28 09:58:46 | 显示全部楼层
看不到 是不是忘记贴图了
日常敲键--头秃一片
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-6-17
在线时间
11 小时
 楼主| 发表于 2021-5-28 11:29:11 | 显示全部楼层
本帖最后由 kjs12580 于 2021-5-28 11:31 编辑
日渐秃兀 发表于 2021-5-28 09:58
看不到 是不是忘记贴图了

注释LCD代码就会出现下面的打印错乱Task1:01234
Task1:01234
Task1:01234
Task1:01234
TTask2:56789
Task2:56789
Task2:56789
Task2:56789
ask1:01234
Task2:56789
Task1:01234
Task1:01234
Task1:01234
Task1:01234
Task1:01234
Task2:56789
Task2:56789
Task2:56789
Task2:56789
Task2:56789
Task1:01234
Task1:01234
Task1:01234
Task1:01234
TTask2:56789
Task2:56789
Task2:56789
Task2:56789
ask1:01234
Task2:56789
Task1:01234
Task1:01234
Task1:01234
Task1:01234
Task1:01234

注释的代码如下
//task1任务函数
void task1_task(void *p_arg)
{
        u8 i,task1_num=0;
        OS_ERR err;
        p_arg = p_arg;
         
//        POINT_COLOR = RED;
//        LCD_ShowString(30,130,110,16,16,"Task1 Run:000");
//        POINT_COLOR = BLUE;
        while(1)
        {
                task1_num++;        //任务1执行次数加1 注意task1_num1加到255的时候会清零!!
//                LCD_ShowxNum(110,130,task1_num,3,16,0x80);        //显示任务执行次数
                for(i=0;i<5;i++) printf("Task1:01234\r\n");
                LED0 = ~LED0;
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
               
        }
}

//task2任务函数
void task2_task(void *p_arg)
{
        u8 i,task2_num=0;
        OS_ERR err;
        p_arg = p_arg;
       
//        POINT_COLOR = RED;
//        LCD_ShowString(30,150,110,16,16,"Task2 Run:000");
//        POINT_COLOR = BLUE;
        while(1)
        {
                task2_num++;        //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
//                LCD_ShowxNum(110,150,task2_num,3,16,0x80);  //显示任务执行次数
                for(i=0;i<5;i++) printf("Task2:56789\r\n");
                LED1 = ~LED1;
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
        }
}



回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
771
金钱
771
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-5-28 11:54:39 | 显示全部楼层
  for(i=0;i<5;i++) printf("Task1:01234\r\n");改成 printf("Task1:%d\r\n",task1_num);这样看吧!看着没什么错
下面那个任务2也是
日常敲键--头秃一片
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6681
金钱
6681
注册时间
2017-4-12
在线时间
1254 小时
发表于 2021-5-28 13:59:27 | 显示全部楼层
得看看你printf怎么重定向的
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-6-17
在线时间
11 小时
 楼主| 发表于 2021-5-28 15:49:07 | 显示全部楼层
245925587 发表于 2021-5-28 13:59
得看看你printf怎么重定向的

用的是原子哥串口1的重定向
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;
};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{        
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
        USART1->DR = (u8) ch;      
        return ch;
}
#endif
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-6-17
在线时间
11 小时
 楼主| 发表于 2021-5-28 15:54:35 | 显示全部楼层

这样可以正常显示执行次数,但不知道为什么原先的没有LCD代码就不行
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
771
金钱
771
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-5-28 17:20:31 | 显示全部楼层
kjs12580 发表于 2021-5-28 15:54
这样可以正常显示执行次数,但不知道为什么原先的没有LCD代码就不行

类似并行执行的 你那样是正常的吧!一个任务优先级比另外一个大的话 是可以在他运行的过程中打断他 让自己执行的
日常敲键--头秃一片
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-6-17
在线时间
11 小时
 楼主| 发表于 2021-5-28 19:34:59 | 显示全部楼层
日渐秃兀 发表于 2021-5-28 17:20
类似并行执行的 你那样是正常的吧!一个任务优先级比另外一个大的话 是可以在他运行的过程中打断他 让自 ...

我设置的两个任务是相同等级的,即使我给了很长的时间片也是会出现任务被打断的情况
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-5-29 00:51:51 | 显示全部楼层
kjs12580 发表于 2021-5-28 11:29
注释LCD代码就会出现下面的打印错乱Task1:01234
Task1:01234
Task1:01234

你两个任务都有printf,printf是一个不可重入的函数,你这样设计很有可能存printf异常的
所以你说的异常时很正常的现象。
你想解决这个问题,可以在OSTimeDly函数之前,加一个等待串口发送完成的操作,这样应该就可以避免这个问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-6-17
在线时间
11 小时
 楼主| 发表于 2021-5-29 21:13:37 | 显示全部楼层
正点原子 发表于 2021-5-29 00:51
你两个任务都有printf,printf是一个不可重入的函数,你这样设计很有可能存printf异常的
所以你说的异常 ...

我在延时函数前加判断发送完成标志还是不行,请问时这里该怎么修改好呢?

//task1任务函数
void task1_task(void *p_arg)
{
        u8 i,task1_num=0;
        OS_ERR err;
        p_arg = p_arg;
         
//        POINT_COLOR = RED;
//        LCD_ShowString(30,130,110,16,16,"Task1 Run:000");
//        POINT_COLOR = BLUE;
        while(1)
        {
                task1_num++;        //任务1执行次数加1 注意task1_num1加到255的时候会清零!!
//                LCD_ShowxNum(110,130,task1_num,3,16,0x80);        //显示任务执行次数
                for(i=0;i<5;i++) printf("Task1:01234\r\n");
                LED0 = ~LED0;
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != 0);
                USART_ClearFlag(USART1,USART_FLAG_TC);
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
               
        }
}


加入这个判断也会出现异常

while((USART1->SR&0X40)==0);

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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