硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4354|回复: 5
收起左侧

[FreeRTOS] FreeRTOS 临界区问题

[复制链接]

10

主题

38

回帖

68

积分

初级会员

积分
68
发表于 2017-7-20 23:48:22 | 显示全部楼层 |阅读模式
HI   
    我阅读 安富莱_STM32-V4开发板_FreeRTOS教程(V1.0).pdf 文件, 参照临界段的历程修改我的代码,发现会在临界区嵌套的时候会挂死系统,我的设计是在一个任务中,记录任务执行的次数,如果次数够20次了,调用一个加入有操作临界区的函数,然后运行一会就挂了。我的主要函数如下:
  1. /*
  2. *********************************************************************************************************
  3. *  函 数 名: StackOverflowTest
  4. *  功能说明: 任务栈溢出测试
  5. *  形 参: 无
  6. *  返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void StackOverflowTest(void)
  10. {
  11.   int16_t i;
  12.   uint8_t buf[500];
  13.   taskENTER_CRITICAL();//进入临界区  
  14.   printf("1111111\r\n");
  15.   (void)buf; /* 防止警告 */
  16.   for(i = 500; i >= 0; i--)
  17.   {
  18.   buf[i] = 0x55;
  19.   }
  20.   taskEXIT_CRITICAL();//退出临界区  
  21. }
  22. /*******************************************************************************
  23. *    函 数 名: vTaskStackOver
  24. *    功能说明: 任务故意让栈溢出
  25. *    形    参:  无
  26. *    返 回 值: 无
  27. *******************************************************************************/
  28. static void vTaskStackOver(void *pvParameters)
  29. {
  30.     uint8_t i =0;
  31.     while(1)
  32.     {
  33.       taskENTER_CRITICAL();//进入临界区
  34.       i++;
  35.       if(i==20)
  36.       {
  37.        // printf("i == %d\r\n",i);
  38.         StackOverflowTest();
  39.         i = 0;
  40.       }
  41.       printf("task test\r\n");
  42.       taskEXIT_CRITICAL();//退出临界区      
  43.       vTaskDelay(500);
  44.     }
  45. }
复制代码
    测试发现,如果打开 printf("i == %d\r\n",i); 这一句就不会死机 , 再不打开的情况下输出的最后一句是
  1. printf("1111111\r\n");
复制代码
  请问这个是为什么呢 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2017-7-21 02:06:31 | 显示全部楼层
你这个程序是为了测试临界区还是栈溢出,如果是临界区,把下面这个改下。
uint8_t buf[500];

buf最大是499,不设置buf[500] =XXX,你试试是否还有问题。
回复

使用道具 举报

10

主题

38

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2017-7-21 09:28:23 | 显示全部楼层
我最后找到了 , 这个栈溢出检查为何没检查出来呢 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2017-7-21 10:11:26 | 显示全部楼层

回 wendell.li 的帖子

wendell.li:我最后找到了 , 这个栈溢出检查为何没检查出来呢 ? (2017-07-21 09:28) 
检测机制性能有限。
回复

使用道具 举报

10

主题

38

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2017-7-21 11:40:42 | 显示全部楼层
请问一下  HardFault_Handler 这个错误如何调试呢 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2017-7-21 12:33:15 | 显示全部楼层

回 wendell.li 的帖子

wendell.li:请问一下  HardFault_Handler 这个错误如何调试呢 ?  (2017-07-21 11:40) 
有,看此贴:http://www.armbbs.cn/forum.php?mod=viewthread&tid=21940
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 02:35 , Processed in 0.220945 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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