变量指针前面的两个减号是什么意思啊
时间:10-02
整理:3721RD
点击:
各位大侠!
对于UCOSii里面有下面的堆栈初始化。
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt) ////堆栈初始化。
{
OS_STK *stk;
(void)opt; /* 'opt' is not used, prevent warning */ // 'opt' 这里并没有使用 ,防止编译器报错。
stk = ptos; /* Load stack pointer */ //加载栈指针。是32位指针。
/* Registers stacked as if auto-saved on exception */
*(stk) = (INT32U)0x01000000L; /* xPSR */
*(--stk) = (INT32U)task; /* Entry Point */
*(--stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/
*(--stk) = (INT32U)0x12121212L; /* R12 */
*(--stk) = (INT32U)0x03030303L; /* R3 */
*(--stk) = (INT32U)0x02020202L; /* R2 */
*(--stk) = (INT32U)0x01010101L; /* R1 */
*(--stk) = (INT32U)p_arg; /* R0 : argument */
/* Remaining registers saved on process stack */
*(--stk) = (INT32U)0x11111111L; /* R11 */
*(--stk) = (INT32U)0x10101010L; /* R10 */
*(--stk) = (INT32U)0x09090909L; /* R9 */
*(--stk) = (INT32U)0x08080808L; /* R8 */
*(--stk) = (INT32U)0x07070707L; /* R7 */
*(--stk) = (INT32U)0x06060606L; /* R6 */
*(--stk) = (INT32U)0x05050505L; /* R5 */
*(--stk) = (INT32U)0x04040404L; /* R4 */
return (stk);
}
*(--stk)这个前面的“--”在这里是个什么意思呢?
对于UCOSii里面有下面的堆栈初始化。
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt) ////堆栈初始化。
{
OS_STK *stk;
(void)opt; /* 'opt' is not used, prevent warning */ // 'opt' 这里并没有使用 ,防止编译器报错。
stk = ptos; /* Load stack pointer */ //加载栈指针。是32位指针。
/* Registers stacked as if auto-saved on exception */
*(stk) = (INT32U)0x01000000L; /* xPSR */
*(--stk) = (INT32U)task; /* Entry Point */
*(--stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/
*(--stk) = (INT32U)0x12121212L; /* R12 */
*(--stk) = (INT32U)0x03030303L; /* R3 */
*(--stk) = (INT32U)0x02020202L; /* R2 */
*(--stk) = (INT32U)0x01010101L; /* R1 */
*(--stk) = (INT32U)p_arg; /* R0 : argument */
/* Remaining registers saved on process stack */
*(--stk) = (INT32U)0x11111111L; /* R11 */
*(--stk) = (INT32U)0x10101010L; /* R10 */
*(--stk) = (INT32U)0x09090909L; /* R9 */
*(--stk) = (INT32U)0x08080808L; /* R8 */
*(--stk) = (INT32U)0x07070707L; /* R7 */
*(--stk) = (INT32U)0x06060606L; /* R6 */
*(--stk) = (INT32U)0x05050505L; /* R5 */
*(--stk) = (INT32U)0x04040404L; /* R4 */
return (stk);
}
*(--stk)这个前面的“--”在这里是个什么意思呢?
--stk减地址!*(--stk)在取出减完地址中的内容。
推测这些(寄存器) xPSR 、“Entry Point”、 R14、 R12 、R3、R2。在物理地址上是连续的
参数pots给出这片连续地址的头
*(--stk)=XXX 就是挨个给寄存器赋值, --写前边表示先移动指针 再给指向的内容(寄存器)赋值, "Entry Point"就是没连续 但离下一个R只差一个32位长度,也可 -- 赋值
这么写代码比较精简
堆栈的方向是由高到低存放的