FreeRTOS シリーズで問題が発生しました (4)。
今日ビデオを見て、次の 2 つのコードが同じ効果を持っていることがわかりました。ポインタとアドレスの概念がまだ不明瞭であることがわかったので、詳しく学ぶことにしましたC言語のポインタとアドレス。
pxTopOfStack = &(pxNewTCB->pxStack[ulStackDepth - ( uint32_t ) 1]);
pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );
では、なぜこのようなことが起こるのでしょうか?
(メッセージ数 7 件) アドレス、ポインタ、ポインタ変数の詳しい解説_ポインタアドレス_CD4356 のブログ-CSDN ブログ
アドレス、ポインター、ポインター変数の詳細については、上記にアクセスしてください。
//pvPortMalloc 函数用于动态分配内存,并返回分配的内存起始地址。在这种情况下,pvPortMalloc 分配的内存大小为 (usStackDepth * sizeof(StackType_t)),即 usStackDepth 乘以 sizeof(StackType_t) 的字节数。
pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) );
//将pxStack变量的值赋给了pxNewTCB->pxStack,即将堆栈的地址存储在TCB的pxStack成员变量中。
pxNewTCB->pxStack = pxStack;
//这里的效果和pxTopOfStack = &(pxNewTCB->pxStack[ulStackDepth - ( uint32_t ) 1])一样,都是对
pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );
pxTopOfStack = &(pxNewTCB->pxStack[ulStackDepth - ( uint32_t ) 1]);
最初の式では、pxTopOfStack
の値が割り当てられますpxNewTCB->pxStack + (ulStackDepth - (uint32_t) 1)
。これは、要素サイズのオフセットをpxNewTCB->pxStack
のポインタに追加し、結果を に格納することを意味します。(ulStackDepth - (uint32_t) 1)
pxTopOfStack
これは通常、タスク スタックの先頭位置を計算するために使用されます。
pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );
2 番目の式では、配列内のインデックスを持つ要素のアドレスを取得し、それを に割り当てること&(pxNewTCB->pxStack[ulStackDepth - (uint32_t) 1])
を意味します。pxNewTCB->pxStack
ulStackDepth - (uint32_t) 1
pxTopOfStack
これは実際には、計算タスク スタックの最上位の位置でもあります。
参考: (7 メッセージ) C_c 言語での [ ] 演算子の解析 []_Zhou Tao Zhe のブログ - CSDN ブログ
C 言語では、p[q] は *(p+q) に相当するため、ここでは(pxNewTCB->pxStack[ulStackDepth - (uint32_t) 1])=
*(
pxNewTCB->pxStack + (ulStackDepth - (uint32_t) 1)
)这里表示的是取这个地址的值
、アドレスが必要な場合は、* を追加してアドレス文字を全体に取り込むだけです。
&(pxNewTCB->pxStack[ulStackDepth - (uint32_t) 1])
= pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );
这里顺带介绍一下
*和&
*:取值符
*用于取这个地址里面的存储的值
&: アドレス文字を取得します
& は、目的の変数のアドレスを取得するために使用されます
したがって、これら 2 つの式の効果は同じで、どちらもタスク スタックの最上位のアドレスを取得します。