FreeRTOS信號量的封裝函數參數是二級指針

1. 先看正確的封裝方式,問題所在,爲何要用2級指針函數

void  cissys_lockcreate(void** mutex) { //建立信號量,應該是互斥鎖
    *mutex = ((SemaphoreHandle_t)xSemaphoreCreateMutex()); }

2. 錯誤的封裝形式ui

void  cissys_lockcreate(void** mutex) { //建立信號量,應該是互斥鎖吧
    mutex =  &((SemaphoreHandle_t)xSemaphoreCreateMutex()); }

3. xSemaphoreCreateMutex的函數原型spa

#define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) { Queue_t *pxNewQueue; const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; pxNewQueue = ( Queue_t * ) xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); prvInitialiseMutex( pxNewQueue ); return pxNewQueue; }

4. 句柄的定義指針

typedef void * QueueHandle_t;

5. (參考別人的寫法)看一下其餘的解釋,錯誤的寫法code

程序1: void main() { char  *p=NULL; myMalloc(p); //這裏的p實際仍是NULL,p的值沒有改變,爲何? 
     if(p) free(p); } void  myMalloc(char  *s)  //我想在函數中分配內存,再返回 
{ s=(char  *)  malloc(100); } 

myMalloc(p)的執行過程:  
分配一個臨時變量char  *s,s的值等於p,也就是NULL,可是s佔用的是與p不一樣的內存空間。此後函數的執行與p一點關係都沒有了!只是用p的值來初始化s。  
而後s=(char  *)  malloc(100),把s的值賦成malloc的地址,對p的值沒有任何影響。p的值仍是NULL。  
注意指針變量只是一個特殊的變量,實際上它存的是整數值,可是它是內存中的某個地址。經過它能夠訪問這個地址。blog

6. (參考別人的寫法)對比正確的寫法內存

程序2: void  myMalloc(char  **s) { *s=(char  *)  malloc(100); } void main() { char  *p=NULL; myMalloc(&p);    //這裏的p能夠獲得正確的值了 
     if(p) free(p); } 

程序2是正確的,爲何呢?看一個執行過程就知道了:  
myMalloc(&p);將p的地址傳入函數,假設存儲p變量的地址是0x5555,則0x5555這個地址存的是指針變量p的值,也就是Ox5555指向p。  
調用的時候一樣分配一個臨時變量char **s,此時s  的值是&p的值也就是0x5555,可是s所佔的空間是另外的空間,只不過它所指向的值是一個地址:Ox5555。  
*s=(char *)malloc(100);這一句話的意思是將s所指向的值,也就是0x5555這個位置上的變量的值賦爲(char *)malloc(100)(並非改變p的地址值0x5555,而是指針變量p自己的值),而0x5555這個位置上存的是剛好是指針變量p,這樣p的值就變成了(char *)malloc(100)的值。即p的值是新分配的這塊內存的起始地址。  ci

7. 本身的總結原型

先假設一個二級指針,S--->P(0x3080)--->BUF1(0x1122),S是二級指針,P是一級指針,BUF1是第一個空間,假設參數是一級指針,那麼咱們只能修改BUF1的內容,S--->P(0x3080)--->BUF1(0x3344),假設參數是二級指針,那麼咱們能夠修改P的值,S--->P(0x4080)--->BUF2(0x7788),就是P指向的空間從BUF1改爲指向了BUF2。it

相關文章
相關標籤/搜索