硬汉嵌入式论坛

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

[μCOS-III] 关于任务堆栈初始化8字节对齐问题

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2019-12-25 11:32:36 | 显示全部楼层 |阅读模式
您好:
      在学习UCOSIII教程中1-11期PDF第九章9.3.3章节,关于任务堆栈初始化的时候,有一处有一点疑惑,首先见下图1:
                                                                 

图1

图1

                                                                                                 图1
     图中描述,任务堆栈空间是按8字节对齐建立的,但是按照最后一行的假设,建立一个uint32_t stack[1024]的堆栈空间,即申请了1024*4,4KB的空间,然后绘制
的堆栈空间排列如下:
                                                                                            

图2

图2


    这一个地址对应的空间却是4字节的空间大小,请问下这里怎么理解8字节的堆栈空间对齐。




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2019-12-25 11:57:37 | 显示全部楼层
8字节对齐是指的首地址8字节对齐(M内核是向下生长的,从高地址到低地址),对齐的含义是首地址对8求余等于0。

当前举的这个例子是对齐的。

自己定义的任务栈控件不对齐也没有关系的,因为在源码这个地方专门做了8字节对齐处理。
QQ截图20191225115919.png
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2019-12-25 12:04:30 | 显示全部楼层
eric2013 发表于 2019-12-25 11:57
8字节对齐是指的首地址8字节对齐(M内核是向下生长的,从高地址到低地址),对齐的含义是首地址对8求余等于 ...

谢谢,这样就明白了
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2019-12-25 14:07:58 | 显示全部楼层
eric2013 发表于 2019-12-25 11:57
8字节对齐是指的首地址8字节对齐(M内核是向下生长的,从高地址到低地址),对齐的含义是首地址对8求余等于 ...

您好,按照您解释的,我下午尝试着做了一个实验,对任务堆栈的大小分别赋了两个不同的值:
1#define  APP_TASK_START_STK_SIZE                    512u
2#define  APP_TASK_START_STK_SIZE                    511u
定义堆栈如下,static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];那么&AppTaskStartStk的值是不可控的。(一个变量的地址应该是编译器分配的,我这样理解不知道对不对)
通过实验发现,任务堆栈初始化函数会处理不满足8字节对齐的首地址使之对齐,我想问下处理后得到的结果,会不会使实际申请的堆栈空间与预想申请的堆栈空间大小与出入呢,因为在这个过程中,&AppTaskStartStk[0]并没有改变,只是处理了AppTaskStartStk[APP_TASK_START_STK_SIZE                    ]。具体实验的结果如下:

在堆栈大小为512u时,通过在线仿真,监测到&AppTaskStartStk值为0x2000 0450,通过任务创建函数OSTaskCreate调用任务堆栈初始化函数OSTaskStkInit,在该函数中设置断点如下:
  1. CPU_STK    *p_stk;


  2.     (void)opt;                                                  /* Prevent compiler warning                               */

  3.     p_stk = &p_stk_base[stk_size];                              /* Load stack pointer                                     */ //断点
  4.                                                                 /* Align the stack to 8-bytes.                            */
  5.     p_stk = (CPU_STK *)((CPU_STK)(p_stk) & 0xFFFFFFF8);                                        //断点
  6.                                                                 /* Registers stacked as if auto-saved on exception        */
复制代码

从watch窗口读出p_stk 的值为0x2000 0C50 ,由于这个值满足8字节对齐,所以前后没有变化,且首尾地址相减得到堆栈大小为512*4即2KB。

然后将在堆栈大小改为511u时,同样方法得到&AppTaskStartStk值为0x2000 0450,在进行8字节对齐处理前p_stk 值为0x2000 0C4C,处理后p_stk 值为0x2000 0C48,这样堆栈的大小是不是变成了510*4的大小。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2019-12-25 14:28:39 | 显示全部楼层
lh1991 发表于 2019-12-25 14:07
您好,按照您解释的,我下午尝试着做了一个实验,对任务堆栈的大小分别赋了两个不同的值:
1#define  AP ...

对,你的理解没问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 06:41 , Processed in 0.266211 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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