C语言
勤勉之
码字中.....。
展开
-
Free RTOS中的任务睡眠
务睡眠函数是一个非常有用的操作系统API,几乎每个RTOS都提供了一个类似的API给应用程序调用,在ucosii里,它叫OSTimeDly;在Nucleus里,它叫NU_Sleep;在FreeRTOS里,它叫vTaskDelay。它们的目的都是一样的,告诉操作系统:“我现在没有事情要做,请把CPU分配给其它任务,并在某个时间点把我唤醒”,这个时间点就是函数的入参,一般都是以tick为单位,如下所示:关于tick和时间片的详细说明见。转载 2024-04-03 17:19:23 · 526 阅读 · 4 评论 -
单链表的插入和删除实例
【代码】单链表的插入和删除实例。原创 2023-04-23 17:33:07 · 223 阅读 · 0 评论 -
【C语言】#和##的作用
##和#在c语言中的介绍原创 2022-07-18 16:56:47 · 1963 阅读 · 1 评论 -
【数据结构】C语言实现队列
#include "test_queue.h"#include <stdio.h>#include <string.h>#include "test_queue.c"#define QUEUE_CACHE_BUFF_SIZE 1024#define QUEUE_RX_TX_BUF 32static QUEUE_HandleTypeDef_t txqueue;QUEUE_DATA_T cache_buff[QUEUE_CACHE_BUFF_SIZE] = {0};un.原创 2022-02-17 18:16:07 · 719 阅读 · 0 评论 -
DEBUG日志宏定义
日志宏定义#define UBC_DEBUG(fmt,args...) printf("[SDK COMMON] %s[%d] -> " #fmt "\n", __FUNCTION__, __LINE__, ##args);原创 2021-11-17 16:50:24 · 1297 阅读 · 0 评论 -
【C语言】带头节点的链表的增删改查示例
#include<stdio.h>#include <stdlib.h>typedef struct node{ int data; struct node *next;}NODE;NODE * creat_List_head();int list_add_item(NODE *list, int data);int list_delete_item(NODE *list,int num);int list_update_item(NODE*lis.原创 2021-10-22 17:19:23 · 207 阅读 · 0 评论 -
【C语言】带头节点的链表的增删
#include <stdio.h>typedef struct grade{ int score; struct grade *next;}NODE;NODE *list_creat();int list_insert(NODE* head,NODE *pNew);int list_delete_item(NODE *list,NODE *item);void list_destory(NODE *list);void showList(NODE *he.原创 2021-10-21 18:10:02 · 156 阅读 · 0 评论 -
【c语言】指针的指针使用方法
指针的指针一般用法是外部人申明,传入另一个函数以后由这个函数申请空间,但是需要注意的是,要在传入之前给这个指针的指针初始化。例如#include<stdio.h>typedef unsigned char u8;typedef unsigned short u16;typedef unsigned int u32;typedef struct{ u16 value_handle; u8 offset; u8 *data; u16 len;} ble_gatts_原创 2021-10-09 17:52:25 · 1502 阅读 · 0 评论 -
【嵌入式linux】进程间通信的几种方式
管道:无名管道PIPO 只能用于亲缘关系的进程间通信 半双工的通信模式。 有名管道 FIFO 可以用于互不相关的两个进程间通信 先进先出规则 信号内核产生信号,用户注册信号处理函数,来进行信号事件的处理共享内存最高效的进程间通信方式,进程可以直接读写内存,不需要任何数据的拷贝 多进程通信过程中。内核分配有共同的内存区,需要访问的进程可以将其映射到自己的私有地址空间。 但是需要依靠互斥锁或者信号量来保证同步性。防止阻塞。共享内存实现:(1)、创建共享内存 ...原创 2021-05-06 23:24:46 · 847 阅读 · 0 评论 -
【C语言】关于c语言中检查内存泄漏的办法
关于c语言中检查内存泄漏的办法从一开始设计之初 就应该有单独分层。将底层的malloc和free等函数 加一层自己的系统函数层。这样有助于后期的移植和检查内存泄漏。例如test_malloc test_free 假如发现了内存泄漏。并且是已知的某个流程。那么我们即可重构一下我们的test_free和test_malloc。 思路如下:首先做一个list或者数组,最好是结构体的,元素为 地址和大小 时间等。有能力的可以增加函数名,更方便。在test_malloc中,每次调用都将本次申请成功的内存地址和原创 2021-04-15 18:12:38 · 1746 阅读 · 0 评论 -
【C语言】开发常用回调函数举例
开发常用回调函数:开发过程中,如果自己的sdk需要提供外部接口,并且需要提供事件通知给用户,我常用的是注册一个事件回调; 就用ota来举个例子,需要在ota开始的时候和结束的时候给用户一个事件。1、 首先,开发者需要提供注册回调函数的接口;a) 定义结构体Enum{ OTA_START, OTA_FINISH,}Event_id;b) 定义回调函数 void (*ota_event_callback)( Event_id event_id,void *data);c) 定义调用体 ,.原创 2020-12-02 15:38:43 · 505 阅读 · 0 评论 -
【工作记录】工作中需要用到的一些很方便的软件
1、软件开发过程中,经常需要画流程图,所以我找了几个好用的流程图软件,1、visio(这就不说了,大家都知道),2、mindmaster(思维导图,还挺好用)2、看代码,我经常用source insight ,这个网上下载一个,再弄个破解工具,很简单的就装好了。3、对比文档软件,beyond compare :这个比对软件挺好用,二进制也可以比,爽。4、ios软件安装工具:爱思助手。这个百度一下,按教程使用就好。5、测试使用demo代码的小工具(我主要用C),dev-c++:挺小的软件,开源原创 2020-11-13 10:33:18 · 303 阅读 · 1 评论 -
【书写makefile】相关符号介绍
本文将介绍一下几种符号:$、=、+=、?=、:=、makefile中,$的意思是取变量的意思,比如,a=4; 那么在后面的语句中,$a 就代表的是取a的值。如果给a定义的是个宏比如 a=FILE_PATH 则后面使用$a的时候意思就是 取FILE_PATH的值。=:意思 就是简单赋值。+=:意思就是添加等号后面的值:=:意思是覆盖之前的值?=:意思就是如果没有被赋值过,就赋值等号后面的值...原创 2020-11-10 11:32:51 · 976 阅读 · 1 评论 -
【C语言】字符串转为十六进制(str_to_hex)
近日在开发过程中,遇到一个问题。将字符串转为十六进制,利用snprintf转换str的格式。下面贴上代码实现。#include <stdio.h>void test_printf5(char *str,int length){ int iii; printf("the str is:"); for(iii= 0;iii <length;iii++) { printf("%02x ",str[iii]); } printf("\n");} /*str原创 2020-09-28 16:47:07 · 24770 阅读 · 2 评论 -
【C语言】指针的指针浅析代码示例
char *p =NULL;main{fun(*p);}fun(**p){ //在其中malloc p ,才能在外面main中拿到p。}原创 2020-08-19 18:03:12 · 240 阅读 · 0 评论 -
打印short、long、long long和unsigned类型
打印unsigned int类型的值,使用%u转换说明;打印long类型的值,使用%ld转换说明。如果系统中int和long的大小相同,使用%d就行。但是,这样的程序被移植到其他系统(int和long类型的大小不同)中会无法正常工作。在x和o前面可以使用l前缀,%lx表示以十六进制格式打印long类型整数,%lo表示以八进制格式打印long类型整数。注意,虽然C允许使用大写或小写的常量后缀,但是在转换说明中只能用小写。 C语言有多种printf()格式。对于...原创 2020-05-20 16:53:15 · 4930 阅读 · 0 评论 -
【C语言】字符的大小写转换
大小写转换原理:根据ascii值来对字符进行大小写转换。每个字符在计算机存储中都是转换成ascii码值。然后再转换为0和1;函数方法://小写转大写int toupper(int c) { if(c >= 'a' && c <= 'z') return c + 'A' - 'a'; return c;}int tolowe...原创 2020-04-28 16:27:32 · 1519 阅读 · 0 评论 -
【C语言】柔性数组----可变长度的数组
1、什么是柔性数组?柔性数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建柔性数组。2、柔性数组有什么用途 ?它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。3、用法:在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度...转载 2020-04-24 15:43:45 · 1297 阅读 · 1 评论 -
【嵌入式操作系统】FreeRTOS信号量mutex和semaphore的区别
今天学习信号量mutex和semaphore的区别,找到了正点原子的博客介绍,讲的挺详细的。建议大家阅读转载自:https://blog.csdn.net/nippon1218/article/details/790391971 二值信号量1.1 二值信号量简介二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有...转载 2020-04-23 10:55:19 · 5469 阅读 · 0 评论 -
【C语言】指针初始化问题
在C语言中。指针初始化通常同 char *str = NULL.而不能写成 char *str.。如果使用第一种,是正确的。因为NULL是被C库宏定义过的。 #define NULL (void*)0 所以赋值以后 这个指针实际是指向0的;也就是NULL 是“零值、等于零”的意思,所以在使用的时候不会出现空指针的问题。如果是第二种。可以这样写。但是必须malloc。如果后面你没有ma...原创 2020-04-17 17:49:32 · 470 阅读 · 0 评论 -
【C语言】项目开发,小细节总结
u16->u8* 取地址,强转。 u8->u16 atoi int atoi(char *str); 类函数宏定义 例如/ #define set_num (a,15) a=15 在打印的时候,控制log级别,可以给封装的printf传入级别。 然后用宏控制打印。方便调试。 使用宏串联结构体数据赋值 #define COMMOND(NAME) ...原创 2020-04-17 16:03:19 · 589 阅读 · 0 评论 -
【C语言】callback函数,回调函数简单例子
#include <stdio.h>#include <stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */typedef void (*ota_start_fun)(int *num1,int *...原创 2020-01-02 16:18:50 · 1144 阅读 · 0 评论 -
【C语言】!!是什么意思?
在C语言中 ! 本来是逻辑运算符逻辑非的意思。逻辑操作符一般将其操作数视为条件表达式,返回结果为Bool类型它的结果不是1 就是0 如果两个!! 在一起出现,则为先将一个非bool类型转换为bool类型。先取反 再取反,示例 !!(arr[2] & 0x04) 此行代码的意思就是将arr数组的 第三位去判断是否是1(arr[2] & 1 )=...原创 2019-10-30 10:38:11 · 35404 阅读 · 3 评论 -
【C语言】C语言打印16进制出现0xffffff现象的问题剖析!
今天在博问里面看到一个朋友的问题,大致是在网络程序中,打印出来的16进制数,莫名的出现ffffff。例如,某个byte真是值为0xc9,打印出来确是0xffffffc9。其实类似的问题不是只在网络程序中才会出现的,看示例代码: 1 #include <stdio.h> 2 int main() 3 { 4 char c = 0xc9; 5 p...转载 2019-10-12 10:27:28 · 1560 阅读 · 0 评论 -
fork和vfork函数的异同点
由于fork完整地拷贝了父进程的整个地址空间,因此执行速度是比较慢的,为了提高效率,Unix系统设计者创建了vfork。 vfork也创建新进程,但是不产生父进程的副本,他通过允许父子进程可访问相同物理内存而伪装了对进程地址空间的真实拷贝,当子进程需要改变内存中数据父进程,这就是著名的“写操作时候时拷贝(copy-on-write)“技术...原创 2018-08-20 20:13:32 · 244 阅读 · 0 评论 -
进程和线程的区别
线程和进程各自有什么区别和优劣呢? 进程是资源分配的最小单位,线程是程序执行的最小单位。 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。 线程之间的通信更方便,...原创 2018-08-20 19:47:07 · 291 阅读 · 0 评论 -
C语言中volatile关键字详解
volatile关键字详解,以及在嵌入式中的应用volatile 关键字的作用是作为指令关键字,确保本条指令不会因为编译器的优化而省略,且要求每次直接读值。关键字 volatile 是与 const 绝对对立的。二、在嵌入式中使用volatile变量如果加了 volatile 修饰,则会从内存重新装载内容,而不是直接从寄存器拷贝内容。 volatile应用比较多的场合,在中断服务程序和cp...转载 2018-08-20 19:40:09 · 807 阅读 · 0 评论 -
快速排序算法解析
一趟快速排序的算法是:1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;5)重复...原创 2018-08-20 11:28:37 · 275 阅读 · 0 评论 -
C语言中整数转字符串输出
#include<stdio.h>#include<string.h>void convert(){ if(n < 0) { str[0] ='-'; n = -n; convert(n,str + 1); return ; } if((n / 10) !...原创 2018-08-17 17:12:50 · 1804 阅读 · 0 评论 -
New 和malloc的区别
今天来说一说面试题 malloc 和 new 的区别从好几个方面来讲: 属性不同 New是C++的关键字,需要编译器支持,而malloc是库函数 需要头文件支持 参数不同 使用new操作符申请内存分配时候不用指定内存块的大小,编译器会根据类型信息自行计算,而malloc则需要指定大小。 返回类型 New操作符内存分配成功时候,返回的是对象类型的指针,...转载 2018-08-16 18:49:34 · 240 阅读 · 0 评论 -
字符设备驱动 --静态/动态申请设备号
静态设备号申请: 申请设备号, from --- 要申请的设备号, count --- 申请几个设备, name --- 设备名字int register_chrdev_region(dev_t from, unsigned count, const char *name) 注销设备号, from --- 要注销的设备号, count--- 注销几个设备...原创 2018-08-07 19:39:48 · 1030 阅读 · 0 评论 -
【C语言】测试计算机是大端序还是小端序
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中;下面给出一种常规的判断计算机是大小端的一段代码#include<stdio.h>int main(void){ int a=0x12345678; char *pc = (char*)&a; if...原创 2018-05-25 16:59:03 · 1424 阅读 · 0 评论 -
排序算法---快速排序详解
最近面试遇到技术面 有问道快排的算法,回来以后我总结了一下,如下。算法介绍: 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。一趟...原创 2018-10-13 22:05:21 · 311 阅读 · 0 评论 -
C语言回调函数详解
回调函数 在C语言编程中,我们经常听到回调函数(callback function)一说。对于C语言新手而言,回调函数可能是一个比较难于理解的东西。今天我将通过一个实际例子,来讲解什么是回调函数,为什么要用回调函数。回调函数究竟有什么作用呢? 说到这里,就有了用户和开发者之间的概念,假设,用户是实现add_ret这个函数,而开发者是实现add这个函数,现在的需求是,用户将a...转载 2018-12-29 14:38:33 · 6268 阅读 · 2 评论 -
【C语言】巧用goto语句计算键盘输入字符长度
今天研究goto语句,突然看到有网友说用goto语句来计算键盘输入字符长度,觉得挺好用,在此贴出来: #include<stdio.h>int count;void getCharLength(){ printf("input a string:\n"); calLength: if(getchar() != '\n') { coun...原创 2019-02-14 14:25:26 · 377 阅读 · 0 评论 -
C语言中的0U或1U是什么意思?
最近学STM32的芯片,官方例程中很多地方有0U/2U/4U...这类的表示,刚开始有些迷茫,细查之后得知,都是C放言默认的数据类型表示.在C语言中,数值常数默认为int型,当数值常量后边有U/UL/f等尾缀时,代表指定其数据类型. 0U 表示 无符号整型 0 1U 表示 无符号整型 1 如果不写U后缀,系...转载 2019-03-04 10:10:57 · 83951 阅读 · 2 评论 -
【嵌入式】位操作 --设置比特位,清除比特位
位操作(Bit manipulation)嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。最佳的解决方案如下:#define BIT3 (0x1 << 3)static int a;void set_bit3(void){ a |= BIT3...原创 2019-03-15 13:32:46 · 2903 阅读 · 0 评论 -
【C语言】printf 输出打印 格式介绍
printf(格式控制,输出列表)格式控制包括格式说明和格式字符。格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。格式字符有d,o,x,u,c,s,f,e,g等。如%d整型输出,%ld长整型输出,%o以八进制数形式输出整数,%x以十六进制数形式输出整数,%u以十进制数输出uns...转载 2019-07-11 14:50:46 · 967 阅读 · 0 评论 -
【C语言】卫语句的解决处理方法
在编程过程中,条件式通常有两种呈现方式,第一种形式是:所有的分支语句都属于正常的行为,第二种形式则是:条件式提供的答案只有一种是正常行为,其他都是不常见的情况. 例如:double getPayAmount(){ double result; if(_isRead) result = deadAmount(); else{ if(_isSeparated) re...原创 2019-07-31 17:37:11 · 885 阅读 · 0 评论 -
linux动态库的初始化和清理(init()函数和fini()函数)
a. Windows 中有 DllMain 入口函数, 而 Linux 中则没有。 b. Linux 中有特殊函数 _init 和 _fini, 主要是分别用来初始化动态库和关闭的时候 做一些必要的处理, 我们可以把自己认为需要的代码放到这两个函数里面, 它们分别 在动态库被加载和释放的时候被执行。具体说, 如果一个动态库里面有一个名字为 "_init"...转载 2019-08-07 13:45:22 · 4336 阅读 · 0 评论