硬汉嵌入式论坛

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

[μCOS-III] 关于UCOS任务堆栈溢出检查的疑问

[复制链接]

22

主题

93

回帖

159

积分

初级会员

积分
159
发表于 2021-7-22 16:31:04 | 显示全部楼层 |阅读模式
CPU_BOOLEAN  OSTaskStkRedzoneChk (OS_TCB  *p_tcb)
{
    CPU_BOOLEAN  stk_status;
    if (p_tcb == (OS_TCB *)0) {
        p_tcb = OSTCBCurPtr;
    }
                                                                /* Check if SP is valid:                                */
                                                                /*   StkBase <= SP < (StkBase + StkSize)                */
    if ((p_tcb->StkPtr <   p_tcb->StkBasePtr) ||
        (p_tcb->StkPtr >= (p_tcb->StkBasePtr + p_tcb->StkSize))) {
        return (OS_FALSE);
    }
    stk_status = OS_TaskStkRedzoneChk(p_tcb->StkBasePtr, p_tcb->StkSize);
    return (stk_status);
}
以上函数是UCOS在进行任务切换时候的堆栈溢出检查。我的疑问是 (p_tcb->StkPtr >= (p_tcb->StkBasePtr + p_tcb->StkSize)))这句是不是应该改成 (p_tcb->StkPtr >= (p_tcb->StkBasePtr + 4*p_tcb->StkSize))),因为实际堆栈大小是要乘4的。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2021-7-22 17:18:31 | 显示全部楼层
这个问题就是这样。

uint32_t *p = (uint32_t *)0x20000000;
p = p + 10;

此时p等于几的问题。
回复

使用道具 举报

3

主题

338

回帖

347

积分

高级会员

积分
347
发表于 2021-7-22 19:30:49 | 显示全部楼层
楼主C语言基础不过关呀。
p_tcb->StkBasePtr是CPU_STK类型的指针。
type *p = 0;
p = p + 1;
那么这时的p跨过了几字节?答案是sizeof(type)
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
 楼主| 发表于 2021-7-23 09:25:04 | 显示全部楼层
eric2013 发表于 2021-7-22 17:18
这个问题就是这样。

uint32_t *p = (uint32_t *)0x20000000;

的确是这样
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
 楼主| 发表于 2021-7-23 09:25:25 | 显示全部楼层
glory 发表于 2021-7-22 19:30
楼主C语言基础不过关呀。
p_tcb->StkBasePtr是CPU_STK类型的指针。
type *p = 0;

是这样的,谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 13:10 , Processed in 0.162564 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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