• FreeRTOS信号量的封装函数参数是二级指针


    1. 先看正确的封装方式,问题所在,为什么要用2级指针

    void  cissys_lockcreate(void** mutex)
    {
        //创建信号量,应该是互斥锁
        *mutex =  ((SemaphoreHandle_t)xSemaphoreCreateMutex());
    }

    2. 错误的封装形式

    void  cissys_lockcreate(void** mutex)
    {
        //创建信号量,应该是互斥锁吧
        mutex =  &((SemaphoreHandle_t)xSemaphoreCreateMutex());
    }

    3. xSemaphoreCreateMutex的函数原型

    #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. (参考别人的写法)看一下其他的解释,错误的写法

    程序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。  
    注意指针变量只是一个特殊的变量,实际上它存的是整数值,但是它是内存中的某个地址。通过它可以访问这个地址。

    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的值是新分配的这块内存的起始地址。  

    7. 自己的总结

    先假设一个二级指针,S--->P(0x3080)--->BUF1(0x1122),S是二级指针,P是一级指针,BUF1是第一个空间,假设参数是一级指针,那么我们只能修改BUF1的内容,S--->P(0x3080)--->BUF1(0x3344),假设参数是二级指针,那么我们可以修改P的值,S--->P(0x4080)--->BUF2(0x7788),就是P指向的空间从BUF1改成指向了BUF2。

  • 相关阅读:
    字符串匹配常见算法(BF,RK,KMP,BM,Sunday)
    JSP基本语法总结【1】(jsp工作原理,脚本元素,指令元素,动作元素)
    JUnit【1】断言用法之assertEquals/True/False/ArrayEquals
    软件测试基础配置
    前端入门20-JavaScript进阶之异步回调的执行时机
    前端入门19-JavaScript进阶之闭包
    前端入门18-JavaScript进阶之作用域链
    前端入门17-JavaScript进阶之作用域
    前端入门16-JavaScript进阶之EC和VO
    前端入门15-JavaScript进阶之原型链
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/8340502.html
Copyright © 2020-2023  润新知