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

相关文章
相关标签/搜索