FreeRTOS操作系统例程:任务栈溢出检测

安富莱电子 www.armfly.com 

安富莱_STM32-V5开发板_FreeRTOS教程(V1.0)


实验目的:

*                1. 学习FreeRTOS的任务栈溢出检测方法一(模拟栈溢出)。

*                2. FreeRTOS的任务栈溢出检测方法一说明:

*                  a. FreeRTOSConfig.h文件中配置宏定义:

*                      #define  configCHECK_FOR_STACK_OVERFLOW  1

*                  b. 在任务切换时检测任务栈指针是否过界了,如果过界了,在任务切换的时候会触发栈溢出钩子函数。

*                      void vApplicationStackOverflowHook( TaskHandle_t xTask,

*                                                          signed char *pcTaskName );

*                      用户可以在钩子函数里面做一些处理。本实验是在钩子函数中打印出现栈溢出的任务。

*                  c. 这种方法不能保证所有的栈溢出都能检测到。比如任务在执行的过程中发送过栈溢出。任务切换前

*                      栈指针又恢复到了正常水平,这种情况在任务切换的时候是检测不到的。又比如任务栈溢出后,把

*                      这部分栈区的数据修改了,这部分栈区的数据不重要或者暂时没有用到还好,如果是重要数据被修

*                      改将直接导致系统进入硬件异常。这种情况下,栈溢出检测功能也是检测不到的。

*                  d. 本实验就是简单的在任务vTaskUserIF中申请过大的栈空间,模拟出一种栈溢出的情况,溢出后触

*                      发钩子函数,因为我们将溢出部分的数据修改了,进而造成进入硬件异常。

 #define  configCHECK_FOR_STACK_OVERFLOW  1

/*

*********************************************************************************************************

* 函 数 名: StackOverflowTest

* 功能说明: 任务栈溢出测试

* 形    参: 无

* 返 回 值: 无

*********************************************************************************************************

*/

static void StackOverflowTest(void)

{

int16_t i;

uint8_t buf[2048];

(void)buf; /* 防止警告 */

/*

  1. 为了能够模拟任务栈溢出,并触发任务栈溢出函数,这里强烈建议使用数组的时候逆着赋值。

    因为对于M3和M4内核的MCU,堆栈生长方向是向下生长的满栈。即高地址是buf[2047], 低地址

    是buf[0]。如果任务栈溢出了,也是从高地址buf[2047]到buf[0]的某个地址开始溢出。

        因此,如果用户直接修改的是buf[0]开始的数据且这些溢出部分的数据比较重要,会直接导致

    进入到硬件异常。

  2. 栈溢出检测是在任务切换的时候执行的,我们这里加个延迟函数,防止修改了重要的数据导致直接

    进入硬件异常。

  3. 任务vTaskTaskUserIF的栈空间大小是2048字节,在此任务的入口已经申请了栈空间大小

------uint8_t ucKeyCode;

    ------uint8_t pcWriteBuffer[500];

    这里再申请如下这么大的栈空间

    -------int16_t i;

-------uint8_t buf[2048];

    必定溢出。

*/

for(i = 2047; i >= 0; i--)

{

buf[i] = 0x55;

vTaskDelay(1);

}

}


/*

*********************************************************************************************************

* 函 数 名: vApplicationStackOverflowHook

* 功能说明: 栈溢出的钩子函数

* 形    参: xTask        任务句柄

*            pcTaskName  任务名

* 返 回 值: 无

*********************************************************************************************************

*/

void vApplicationStackOverflowHook( TaskHandle_t xTask, signed char *pcTaskName )

{

printf("任务:%s 发现栈溢出\r\n", pcTaskName);

}

实验目的:

*                1. 学习FreeRTOS的任务栈溢出检测方法二(模拟栈溢出)。

*                2. FreeRTOS的任务栈溢出检测方法二说明:

*                  a. FreeRTOSConfig.h文件中配置宏定义:

*                      #define  configCHECK_FOR_STACK_OVERFLOW  2

*                  b. 在任务切换时检测任务栈指针是否过界了,如果过界了,在任务切换的时候会触发栈溢出钩子函数。

*                      void vApplicationStackOverflowHook( TaskHandle_t xTask,

*                                                          signed char *pcTaskName );

*                      用户可以在钩子函数里面做一些处理。本实验是在钩子函数中打印出现栈溢出的任务。

*                  c. 任务创建的时候将任务栈所有数据初始化为0xa5,任务切换时进行任务栈检测的时候检测末尾

*                      的16个字节是否都是0xa5,通过这种方式来检测任务栈是否溢出了。相比方法一,这种方法的速度

*                      稍慢些,但是这样就有效的避免了方法一里面的部分情况。不过依然不能保证所有的栈溢出都能检测

*                      到,比如任务栈末尾的16个字节没有用到,即没有被修改,但是任务栈已经溢出了,这种情况是检

*                      测不到的。另外任务栈溢出后,任务栈末尾的16个字节没有修改,但是溢出部分的栈区的数据修改

*                      了,这部分栈区的数据不重要或者暂时没有用到还好,如果是重要数据被修改将直接导致系统进入硬

*                      件异常。这种情况下,栈溢出检测功能也是检测不到的。

*                  d. 本实验就是简单的在任务vTaskUserIF中申请过大的栈空间,模拟出一种栈溢出的情况,溢出后触

*                      发钩子函数,因为我们将溢出部分的数据修改了,进而造成进入硬件异常。

#define  configCHECK_FOR_STACK_OVERFLOW  2

函数内容和上面一样:

static void StackOverflowTest(void)

void vApplicationStackOverflowHook( TaskHandle_t xTask, signed char *pcTaskName )

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容