OpenEdv-开源电子网

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

奇怪现象:两个同优先级任务打印信息冲突,过几秒种后正常

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-8-27
在线时间
3 小时
发表于 2019-11-3 21:14:14 | 显示全部楼层 |阅读模式
1金钱
各位大神,
    我在stm32f407开发板上带FreeRTOS操作系统运行时,创建了两个任务,任务一中打印一串信息,任务二中打印一串信息,但是在调试时发现打印出的信息错乱,但是过段时间恢复正常。
注: 两个任务为同优先级,且时间片修改为100ms切换。  
修改如下: #define configTICK_RATE_HZ                                ( ( TickType_t ) 10 )   

    代码如下:
    /**********LED1*************/
void vTaskLED1(void *pvParameters)
{
        while(1)
        {
                printf("Task1 is running\r\n");
                for(uint32_t i=0;i<0x1ffffff;i++);
        }
}

/**********LED2************/
void vTaskLED2(void *pvParameters)
{
        while(1)
        {
                printf("Task2 is running\r\n");
                for(uint32_t i=0;i<0x1ffffff;i++);
        }
}

void Task_Create(void)
{

    xTaskCreate(vTaskLED1,      
                     "vTaskLED1",      
                     128,               
                     NULL,            
                     3,               
                     &TaskLED1_Handle   
                     );
       
        xTaskCreate(vTaskLED2,      
                     "vTaskLED2",      
                     128,               
                     NULL,              
                     3,                  
                     &TaskLED2_Handle   
                     );

        printf("LED1 and LED2 Task is Create\r\n");       
}


int main()
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);       
        Bsp_Led_Init();
        uart_init(115200);
        printf("hello world, welcome to FreeRtos\r\n");

        Task_Create();
        vTaskStartScheduler();

        while(1)
        {
        }
}

实际运行结果如图所示:

[21:08:23.245]收←◆hello world, welcome to FreeRtos
LED1 and LED2 Task is Create
TTaasskk2 1is  isr ruunnnniingng


[21:08:25.272]收←◆TaskT2 aiss k1r ius nrniungnni
ng

[21:08:27.295]收←◆Task2 Tiassk1  ruinnsin grunn
ing

[21:08:29.320]收←◆Task2 iTs arusnk1n iis nrgu
nning

[21:08:31.346]收←◆Task2 is ruTnnainsgk1 i
s running

[21:08:33.371]收←◆Task2 is runnTinags
k1 is running

[21:08:35.396]收←◆Task2 is running
Task1 is running

[21:08:37.421]收←◆Task2 is running
Task1 is running

[21:08:39.446]收←◆Task2 is running
Task1 is running


从上面结果来看,刚开始是乱的,但运行几秒种后就恢复正常,一直没找到原因,请各位大神帮忙看看,不胜感激。


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

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-11-5 08:46:01 | 显示全部楼层
由于两个任务的优先级是相同的,在任意时刻都会互相打断,开始输出的不是乱码,而是任务1打印了几个字符被任务2打断,任务2打印几个字符又被任务1打断。运行一会正常后,说明任务1和任务2切换时,时间刚好岔开了。所以交替打印,没有出现乱码。要想两个任务轮流打印不出现乱码,在打印时要进入临界状态,禁止任务切换,这样打印就正常了。
回复

使用道具 举报

8

主题

185

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
47 小时
发表于 2019-11-5 09:21:19 | 显示全部楼层
先说好我不是大神,初始出现那个现象感觉像出现了竞争导致,在使用printf("Task1 is running\r\n")加个自旋锁试试。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-8-27
在线时间
3 小时
 楼主| 发表于 2019-11-5 21:43:59 | 显示全部楼层
HXYDJ 发表于 2019-11-5 08:46
由于两个任务的优先级是相同的,在任意时刻都会互相打断,开始输出的不是乱码,而是任务1打印了几个字符被 ...

首先,非常感谢您的回复,这个现象肯定是任务切换太快导致。
但是很奇怪的串口输出的波特率为115200,打印的字符不超过20个字符。我们就按照100个字符计算,一个字节加上开始位、停止位、奇偶校验位共11位,也就是说打印字符的时间可以算出理论值位11*100/115200=9.5ms左右。
如果按照freeRTOS默认设置,一个时间片时间为1ms,出现这种现象是正常的。
但是我修改配置为#define configTICK_RATE_HZ              ( ( TickType_t ) 10 ) ,即设置的时间片为100ms,时间足够这些字符的打印输出了。所以按照理论计算,不应该出现任务切换打断数据输出的情况,但实际测试还是会打断。这是我感觉奇怪的地方。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 04:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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