OpenEdv-开源电子网

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

基于FreeRtos串口收发数据,一开始数据可以正常接收,后面数据不能正常接收,整个系统卡死。

[复制链接]

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2022-4-1
在线时间
12 小时
发表于 2022-11-25 16:08:24 | 显示全部楼层 |阅读模式
10金钱
问题及场景如下:
创建一个二值信号量;
创建一个事件组;

在创建4个任务:

Data_Process_task    : 接收中断字符串信息处理任务。(等待USART串口释放二值信号量,Data_Process_task获得信号量,实现任务同步)
      Data_Process_task在接收到字符串后,将事件组标志位第一位置1;

Key_Action__task      :   按键处理任务,将事件组标志位第二位置1;

Mov_Action__task     :   等待事件组标志位第一第二位都置一时,才执行别的操作。

Task_Running_task    :   提示系统正在运行。

我在实验的时候:
  串口组手发送字符串,串口接收中断接收到字符串后,系统能够正常运行,Mov_Action__task在所有标志位都置1后的操作也能正常执行,但是我在发送第五个字符串时,整个系统就会卡死,也没有断言错误。



  后面我在Task_Running_task(优先级较低)中,加入了几行代码,想查看每个任务的信息,代码入如下:
    char *pbuffer = (char *)calloc(1, 200);
    printf("--------------- heap: ---------------------\r\n");
    vTaskList(pbuffer);
    printf("%s", pbuffer);
    printf("----------------------------------------------\r\n");
    free(pbuffer);


后面程序就可以成功进行了,也可以接收10个字符串(我的目的就是接收10个字符串)。但是注释掉上面的代码就又不行了。

我一开始是以为是任务堆栈分配的不够,但是从vTaskList的打印信息来看,任务堆栈是够的。对此我是百思不得其解。
附件中有相关代码。



附件.pdf

91.87 KB, 下载次数: 12

最佳答案

查看完整内容[请看2#楼]

1、FREERTOSCONFIG.h 中堆空间用任务栈 默认为( ( size_t ) ( 17 * 1024 ) ) 是否够? 2、系统栈空间是否够? KEIL默认系统栈为200 3、每个任务分配的栈空间是否够? 打印出每个任务的堆栈信息 4、FREERTOSCONFIG.h 中 configMAX_SYSCALL_INTERRUPT_PRIORITY 默认为 191,可受FreeRTOS控制的中断优先级为11,12,13,14,15. 你的串口中断定义的中断优先 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-25 16:08:25 | 显示全部楼层

   1、FREERTOSCONFIG.h 中堆空间用任务栈  默认为( ( size_t ) ( 17 * 1024 ) )
              是否够?
   2、系统栈空间是否够?
           KEIL默认系统栈为200 屏幕截图 2022-11-25 184937.png

  3、每个任务分配的栈空间是否够?
           打印出每个任务的堆栈信息

  4、FREERTOSCONFIG.h 中  configMAX_SYSCALL_INTERRUPT_PRIORITY  默认为        191,可受FreeRTOS控制的中断优先级为11,12,13,14,15.
          你的串口中断定义的中断优先级号是否在11---15之间。
  5、FREERTOS规定嵌套优先级分组为 4
            NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);   //嵌套优先级分组为 4
         你是否分组为4?


回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2022-4-1
在线时间
12 小时
 楼主| 发表于 2022-11-26 09:50:52 | 显示全部楼层
霸王猫 发表于 2022-11-25 18:54
1、FREERTOSCONFIG.h 中堆空间用任务栈  默认为( ( size_t ) ( 17 * 1024 ) )
              是否够 ...

非常非常感谢您的回答,目前问题已经解决!
在我看到您第二条关于系统栈空间的时候,我自己修改了一下堆栈空间大小,然后就能正常运行,再次谢谢您!

1.
这一条我没有怎么看懂,可以是解释一下什么意思嘛?

2.
堆栈我的修改如下:
Stack Size : 0x0000 0800
Heap Size : 0x0000 0800

3.我利用vTaskList()函数打印任务堆栈信息,信息如下:

没接收到字符串时:
--------------- heap: ---------------------
Task_Running           R        2        198        5
RTC_Running            R        2        72        6
IDLE                   R        0        120        2
Key_Action             B        3        100        7
Mov_Action             B        4        100        8
Data_Process           B        7        256        4
start                  D        1        164        1
Tmr Svc                S        31        236        3
----------------------------------------------

接收完1个字符串后:
--------------- heap: ---------------------
Task_Running           R        2        192        5
RTC_Running            R        2        68        6
IDLE                   R        0        108        2
Data_Process           B        7        252        4
Mov_Action             B        4        84        8
Key_Action             B        3        90        7
Tmr Svc                S        31        236        3
----------------------------------------------
.
.
.
接收完10个字符串后:
--------------- heap: ---------------------
Task_Running           R        2        192        5
RTC_Running            R        2        68        6
IDLE                   R        0        108        2
Data_Process           B        7        252        4
Mov_Action             B        4        84        8
Key_Action             B        3        86        7
Tmr Svc                S        31        236        3
----------------------------------------------


4.FREERTOSCONFIG.h 中,configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        为5
我的串口中断定义的中断优先级号为6,理论是应该是可行的,只要串口优先级大于5就行。

        //Usart1 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=6;//抢占优先级6
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                //子优先级0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
       
       
5.FREERTOS规定嵌套优先级分组为 4
我的代码中:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组 4

回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-26 18:55:52 | 显示全部楼层
1、FREERTOSCONFIG.h 中堆空间用任务栈  默认为( ( size_t ) ( 17 * 1024 ) )

   

   所有的任务都是从    【( ( size_t ) ( 17 * 1024 ) )】 这个划分的空间,给每个任务分配栈区,这叫【用户栈】。

              用户栈:存储任务中的局部变量、函数调用、参数入口参数、函数返回地址的保护
2、下图是系统栈


    用于进入中断服务程序保护现场


回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-26 18:59:10 | 显示全部楼层
本帖最后由 霸王猫 于 2022-11-26 19:00 编辑

STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)
(16条消息) STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)_ba_wang_mao的博客-CSDN博客


STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)
(16条消息) STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)_ba_wang_mao的博客-CSDN博客


STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)
(16条消息) STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)_ba_wang_mao的博客-CSDN博客


STM32F103移植FreeRTOS必须搞明白的系列知识---4(FreeRTOSConfig.h配置文件)
(16条消息) STM32F103移植FreeRTOS必须搞明白的系列知识---4(FreeRTOSConfig.h配置文件)_ba_wang_mao的博客-CSDN博客
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 13:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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