首页
学习
活动
专区
圈层
工具
发布

指针:这块地方是我的了!

就是给了这块内存一个机器,直接在上面操作了,不需要复制一个新的地方在操作。 当函数参数是指向基本数据类型的指针时,函数可以修改传递给它的变量的值。...这通常用于模拟“传值传引用”的机制,即通过指针将数据传递给函数,从而使函数能够直接修改原始数据。...是这样的,一个函数的参数在调用的时候,是需要把参数复制一遍的,如果这个参数本身就复合类型,那确实很大,如果就是传个地址进来就很小了。...在C语言中,引用传递并不像C++那样有直接的引用类型(&)来实现,但是我们可以通过使用指针来模拟引用传递的效果。 指针作为函数参数时,允许函数操作传递给它的变量的内存地址,从而实现对原始数据的修改。...使用函数指针作为参数或回调,可以极大地提高模块化设计的灵活性。设计通用的库函数时,可以将实现的具体细节委托给用户提供的函数。

31010

STM32CubeMX | | 使用小熊派串口驱动峰汇ETH-01以太网模块上传数据到OneNet

以下是读TCP状态的IO,配置为上拉输入模式,用于监测网卡是否已经连接服务器 image.png 以下是配置模式IO,当输出电平为低时为指令配置模式,当输出电平为高时为数据透传模式: image.png...发送网络透传数据函数,必须在透传模式下使用 void RJ45_Send_NetWork_Penetrate_Data(char* fmt, ...); uint8_t Check_TCP_Status...,先要将配置引脚拉低,然后开启DMA接收,接下来按照通信协议要求将对应的格式填入到发送Buffer,然后调用wifi_uart_write_data函数将协议数据通过串口发给模块,在一定超时延时以后,需要检测...,如果获取到的模块配置参数正确,接下来在网口连接正确的情况下即可以进入数据透传模式,就是直接和服务器打交道了,实现如下: /*进入数据透传模式*/ uint8_t Enter_Data_Penetrate_Mode...,这时候就可以将整包数据获取出来,处理获取数据的逻辑在main函数的while循环中实现: /** * @brief The application entry point

89920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    FreeRTOS 消息队列

    FreeRTOS 的队列内容是内存拷贝, 我们将要发送的内容的地址传递给发送函数,该函数会将地址上的内容拷贝到自己的存储区域;而接收函数会将消息内容拷贝到我们传递给他的指针指向的内存区域。...这部分代码在源码目录下 queue.c 中。 数据结构 队列实现围绕其数据结构, 如下说明队列的数据结构, 其每个数据成员的作用。 姑且不管是否理解, 后续会一步一步介绍它的具体应用。...对于正常情况下, 数据可以插入队列, 调用拷贝函数将新数据保存到队列的队列项存储区域, 更新队列相关指针和参数, 对于拷贝函数, 在队列作为互斥锁时, 发送消息实际上就是释放锁, 而互斥锁为了避免任务优先级反转...如果恢复的任务优先级比当前任务高, 则会触发任务切换;但是在中断中调用的这个函数的做法是返回一个参数标志是否需要触发任务切换,并不在中断中切换任务。...如果队列中有消息未读, 首先会把待读的消息复制到传进来的指针所指内, 然后判断函数参数 xJustPeeking == pdFALSE的时候, 符合的话, 说明这个函数读取了数据, 需要把被读取的数据做出队处理

    2.6K20

    回调函数的注册机制为什么会在嵌入式固件开发中应用如此广泛?

    在我们平时开发STM32或者其它单片机时,我们经常都会用到原厂提供的固件库函数,固件库函数中有非常多回调函数。那么什么是回调函数呢?回调函数是作为参数传递给另一个函数的函数。...在程序运行期间,可以设置相同的函数指针指向不同的函数。在下面的代码中,我们可以看到如何使用函数指针将函数作为参数传递给函数。该函数将函数指针和两个整数值作为参数和。...将执行的算术运算取决于将传递给函数指针参数的函数。...首先声明一个函数指针,用于访问回调函数我们可以简单地将函数指针声明为: uint8_t (*p_CallbackFunc)(void); 但是对于更清晰的代码,最好定义一个函数指针类型: typedef...(void) { //在这里完成处理工作 } 当从物理通信接口(例如 UART)接收到新字节(事件)时,用户应用程序代码会调用我们示例中的回调函数。

    2.8K50

    c 语言函数指针之回调函数

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。...回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 2 为什么要用回调函数?...它只需知道存在一个具有特定原型和限制条件的被调用函数。 简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。 ?...但仔细看,可以发现两者之间的一个关键的不同:在回调中,主程序把回调函数像参数一样传入库函数。 这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,这样有没有觉得很灵活?...struct { uint8_t mStatus; uint8_t (* Funtion)(void); //函数指针的形式 } M26_WorkStatus_TypeDef; //M26的工作状态集合调用函数

    1.4K41

    实际工程中的 C++ 模板

    我们知道,C++ 的模板有个规则是 SFINAE,这不是一个单词,而是 Substitution Failure Is Not An Error 的缩写,也就是说,编译器在基于模板生成代码时,如果将模板的类型参数置换为给定的类型时...这里的 lib::void_t 是什么?std::void_t 是 C++ 17 之后才在 STL 中提供的模板,它很简单也非常有用,功能是将任意的类型序列映射到 void 上,也就是忽略掉这些类型。...当然,我们可以像原先一样在外部自行设置 key,然后再将 data 传进来,但是我们更加希望能够免去这一个步骤,直接通过 Get 函数的参数传入对应的 key,然后转交给 data。...最让人难受的一点是,我们丢失了 data.SetKey 所需参数的类型信息,这让调用者完全不知道这里应该填什么数据。...因此我们需要用另一个标记将两个类型完全区分开来,我们可以在类型参数列表里加多一个类型参数来做到这一点,这个类型参数的唯一作用就是用来实现类型的区分: template<class T, class Tag

    2.5K20

    C语言函数指针之回调函数

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。...回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 2 为什么要用回调函数?...它只需知道存在一个具有特定原型和限制条件的被调用函数。 简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。 ?...但仔细看,可以发现两者之间的一个关键的不同:在回调中,主程序把回调函数像参数一样传入库函数。 这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,这样有没有觉得很灵活?...struct { uint8_t mStatus; uint8_t (* Funtion)(void); //函数指针的形式 } M26_WorkStatus_TypeDef; //M26的工作状态集合调用函数

    1.8K10

    C语言回调函数,提升C技巧必备

    /*将Func函数的首地址赋给指针变量p*/ p = &Func; /*将Func函数的首地址赋给指针变量p*/ 赋值时函数 Func 不带括号,也不带参数。...如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。...回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。...它只需知道存在一个具有特定原型和限制条件的被调用函数。 简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。...但仔细看,可以发现两者之间的一个关键的不同:在回调中,主程序把回调函数像参数一样传入库函数。 这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,这样有没有觉得很灵活?

    1.3K10

    FreeRTOS-内存管理(一)

    ];可以看到,所谓的堆其是就是一段连续的内存空间,就是一个巨大的数组,在F103中的FreeRTOSConfig.h中,将这个数组大小设置为了17KB。...接下来需要关闭调度器,防止分配内存时,被任务调度打断。...初始函数将这两个指针分别指向了堆的开头和结尾,然后将pxFirstFreeBlock指向当前可分配的地址:下面先讲解内存释放函数:void vPortFree( void * pv ){ uint8...也就是说,我们将要释放的地址传递给这个API,函数就会根据我们提供的地址,定位到指定块,然后将其连接到空闲链表上,并修改标志位,表示这块内存可用。...heap_2.c的内存分配函数原理与1差不多,也要考虑内存对齐问题,其接收到我们提供的参数(要分配内存的大小)后,遍历空闲链表,如果匹配到需要大小的块,就占用这个地址,并从空闲链表中移除。

    37210

    FreeRTOS 任务调度 任务创建

    回传的句柄(指向TCB的指针)一般用于在其他任务中发送消息通知给任务,或者删除任务时引用。 任务成功创建后返回 pdPASS, 否则失败回传错误码。...API 在使用前最后需要看看是否需要设置对应的宏定义)。 ---- 叙述完上层的调用,后续介绍背后具体是如何实现的。...传递给函数,用户自己申请栈的内存,创建函数只负责申请 TCB 所需内存空间 项目中接触版本 V8.0.0, 发现有一些改动, 旧版中实际创建任务的函数实际是 xTaskGenericCreate, 参数比较多...所以调用这个函数,在内存堆空间不足或者碎片话的情况下,可能创建新任务失败,需要判断函数执行后是否成功返回。 其源码解析如下所示。...其中LR 寄存器设置的地址是系统的出错处理函数,如果任务错误返回,就会调用该函数。 根据 约定, R0~R3保存调用时传递的参数。

    3.7K50

    TinyFlashDB:一种超轻量的可纠错的通用单片机Flash存储方案

    摘要:在单片机日常开发中,总会需要存储一些信息,这时就需要使用单片机FLASH存储的方案,目前单片机存储的方案有很多如:EASYFLASH、FLASHDB、OSAL_NV等等方案,他们程序都非常大,在存储不多的变量时不值得...当芯片对于写入的数据区缓存有特殊要求(例如4字节对齐,256字节对齐等),可以通过该参数将符合要求的变量指针传递给函数使用。至少为4字节长度。...value_from); 函数功能:在index指向的扇区中写入一个index中指定变量长度的变量,flash头部数据校验出错重新初始化flash。...当芯片对于写入的数据区缓存有特殊要求(例如4字节对齐,256字节对齐等),可以通过该参数将符合要求的变量指针传递给函数使用。至少为4字节长度。...读取数据时也会计算和校验,不通过的话继续读取,直到返回校验通过的最新数据,或者读取失败。

    1.4K10

    【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )

    length); mmap 函数参数含义 : void* start : 如果为 0 就是让系统自动分配 , 如果不为 0 , 则由用户指定分配的地址 ; size_t length : 申请分配内存的大小...mmap 的参数放到 parameters 数组中 , 之后要将该地址传递给远程进程的 ESP 寄存器 , 用于指定 long parameters[10]; /* 下面是远程调用 mmap 函数分配栈内存信息...; /* 将 long* params 参数写出到 pid 对应的远程进程中 , 然后将写出后数据的首地址 , 设置到 pid_t pid 进程号对应的远程进程的 ESP 寄存器中 ,...设置的数据长度 4 字节 */ ptrace_writedata(pid, (uint8_t*)(void*)regs->esp, (uint8_t*)params, (num_params...pid 对应的远程进程中 , 然后将写出后数据的首地址 , 设置到 pid_t pid 进程号对应的远程进程的 ESP 寄存器中 , 设置的数据长度 4 字节 */ ptrace_writedata

    95810

    还不懂函数回调机制,看这篇就够了

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。...回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。...将函数指针作为参数传给函数 函数指针和普通指针一样,我们可以将它作为函数的参数传递给函数,下面我们看看如何实现函数指针的传参: /* func3 将函数指针 p_func 作为其形参 */ void...,最后一个参数是传入的函数,也即是将函数指针作为参数传给函数: /* * *@ author:lanxin * *@ brief:添加新的timer * *@ note:如果之后要操作这个定时器,...回调函数在命令解析中应用思考 再想想,我们在数据逻辑处理中,一般会有很多的功能码,如果我们采用命令码和回调函数绑定的方式,那代码维护起来是不是很方便...

    3.7K33

    CC++面向对象编程之封装

    在C++语言中,类也是一种构造类型,但是进行了一些扩展,可以将类看做是结构体的升级版,类的成员不但可以是变量,还可以是函数;不同的是,通过结构体定义出来的变量还是叫变量,而通过类定义出来的变量有了新的名称...,叫做对象(Object)在 C++ 中,通过类名就可以创建对象,这个过程叫做类的实例化,因此也称对象是类的一个实例(Instance)类的成员变量称为属性(Property),将类的成员函数称为方法(...成员变量的作用域不是全局,不经任何处理就无法在函数内部访问。 C++规定,编译成员函数时要额外添加一个this指针参数,把当前对象的指针传递进去,通过this指针来访问成员变量。...this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。...这样通过传递对象指针完成了成员函数和成员变量的关联。这与我们从表明上看到的刚好相反,通过对象调用成员函数时,不是通过对象找函数,而是通过函数找对象。

    1.1K10
    领券