Engineer-Bruce_Yang
本科毕业于华南理工大学,美国Carroll University工商管理硕士,曾就职于世界名企伟易达,安防军工砺剑防卫公司,多年嵌入式产品开发经验,在智能玩具、安防产品、平板电脑、手机开发有丰富的实战开发经验。
展开
-
如何将回调和中断服务函数进行结合?
击上方“嵌入式应用研究院”,选择“置顶/星标公众号”干货福利,第一时间送达!使用回调的方法可用于轻松创建灵活且可扩展的中断服务程序。开发人员可以使用多种方法以这种方式使用回调。 可...原创 2021-12-19 22:14:34 · 926 阅读 · 0 评论 -
多按键多界面二维数组表驱动设计
击上方“嵌入式应用研究院”,选择“置顶/星标公众号”干货福利,第一时间送达!键盘是我们经常能在嵌入式产品上看到的输入设备之一。一般情况下,键盘通常会有指定的按键码。根据用户按下的按键来执行...原创 2021-12-20 17:30:00 · 960 阅读 · 0 评论 -
在编写RTOS代码时,如何设计一个简单、优雅、可拓展的任务初始化结构?
击上方“嵌入式应用研究院”,选择“置顶/星标公众号”干货福利,第一时间送达!随着写代码功力的提升,个人对于代码的整洁、优雅、可维护、易拓展等就有了一定的要求,虽然自己曾经就属于那种全局变量...原创 2021-12-14 20:14:42 · 607 阅读 · 0 评论 -
回调函数的注册机制为什么会在嵌入式固件开发中应用如此广泛?
击上方“嵌入式应用研究院”,选择“置顶/星标公众号”干货福利,第一时间送达! 在我们平时开发STM32或者其它单片机时,我们经常都会用到原厂提供的固件库函数,固件库函数中有非常多回调...原创 2021-11-30 22:16:36 · 787 阅读 · 0 评论 -
分享两个C库源码中的移位函数
以下源代码是之前阅读C库代码获取的,分享一下:_lrotr()将一个无符号长整形数左循环移位的函数原形:unsigned long _lrotr(unsigned long value,...原创 2020-06-27 23:13:51 · 2819 阅读 · 0 评论 -
C语言解析INI文件(利用开源的iniparse库)
一、了解什么是INI文件?ini 文件是Initialization File的缩写,即初始化文件,这是用来配置应用软件以实现不同用户的要求。二、INI文件的格式INI文件由节、键、值组成。一个简单的的INI文件例子如下:[Setting]INIT_FLAG=0;VOLUME=1;LANGUAGE=1;如上例子,[Setting]就是节,=号左边的值是键,=号右边的是值。三、...原创 2020-01-01 22:48:28 · 3452 阅读 · 1 评论 -
C语言.csv编程应用
在有些产品的研发过程中,一般我们都有很多条数据记录在一个LOG文件中。在查看最新的数据记录都是从最开始保存的那条开始存储,所以,参考了网上一些实现方法,稍微修改了一下即得到了下面的解决方法: 假设文件存储如下内容:2018/10/24 16:28 橙子 水果 2018/10/21 10:16 啤酒 饮料 2018/10/22 10:16...原创 2018-10-23 17:06:03 · 2454 阅读 · 2 评论 -
简单的C语言宏定义结合全局变量的方法实现单片机串口实现透传模式
何谓透传?根据百度百科给出的定义如下: 透传,即透明传输(pass-through),指的是在通讯中不管传输的业务内容如何,只负责将传输的内容由源地址传输到目的地址,而不对业务数据内容做任何改变。 在现实单片机产品开发过程中,如果存在多个串口,在调试打印某个模块信息的时候,大多数人的做法是将所有模块的TX、RX、GND引出来,分别接到不同的调试口去,通过PC终端...原创 2018-10-11 09:42:57 · 1773 阅读 · 0 评论 -
C语言根据空格分割获取字符串单元
完整源码获取:微信关注:嵌入式开发圈发送"分割字符串案例"即可获取。协议做如下规定:规定数据协议:序列号 长度 状态字 数据长度 数据1 数据2 数据3以空格作为数据单元。 ep: 00001 00007 1 3 34567 26358 32698 (1) (2) (3)(4) (5) (6...原创 2018-10-08 14:30:10 · 8323 阅读 · 0 评论 -
C语言实现AT指令ASCII码的拼接处理流程
在GSM模块、NBIOT模块、4G模块的C/C++编程当中,很多这样的模块已经做成了标准的AT指令集,难免涉及到字符串的操作,比如拆分,拼接成一个AT指令。 众所周知,AT指令我感觉太恶心,为啥要设计出格式如此复杂的指令发送和回复?不过既然有标准,那肯定也有应对方法。 最近在使用NBIOT---BC28模块,我的任务是将IMEI码与IMSI码读出来后,利...原创 2018-10-08 14:00:55 · 5278 阅读 · 2 评论 -
C语言之数组按协议存储与按协议解析
协议需求:(1)序列号(1个字节) 属性(1个字节) 名称(18个字节)(2)现有一块空间为600个字节,以20个字节为单位,分别存储以上数据,直到存满为止,并能解析。根据协议,我们可以设计一个结构体来表述这些数据:struct Data_Info{ char serial_num ; //序列号 char property ; //属性 char sampl...原创 2018-09-29 20:48:02 · 1570 阅读 · 2 评论 -
C语言实现简易金山打字通
本小项目最终的实现如下:输入相应的字符,然后在最下面能够统计错误的个数,输入字符总个数,输入个数以及错误率。那如何来实现这个小项目呢?规划如下,我们需要大致实现以下三个模块:(1)输入模块(2)显示模块(3)统计模块实现过程:使用getch()函数可以获取键盘输入的字符,显示可以使用Window自带的API来实现,统计就很简单了,就是计算输入字符的个数等等。。。接下来就是简单的软件逻辑的实现。源码...原创 2018-06-08 14:17:57 · 3478 阅读 · 8 评论 -
设计一条简单的等待工作队列之软件模型设计与实现(三)
http://blog.youkuaiyun.com/morixinguan/article/details/77758206http://blog.youkuaiyun.com/morixinguan/article/details/77783311在前面两篇文章中,可能考虑到后面需要设计复杂的工作队列,所以加入了线程机制。但由于设计的是一条简单的等待工作队列,却用到了线程,其实没有必要,线程在这个地方反倒是有点浪费资原创 2017-09-02 18:59:28 · 643 阅读 · 0 评论 -
基于C语言链表实现的工作任务注册与执行
链表是个好东西,可以实现很多东西,在Linux内核中发现一些宏的封装,感觉非常有意思,于是我也模仿了Linux内核的风格,实现了一个,先来看看头文件:work.h#ifndef __WORK_H#define __WORK_H#include #include #include #include #include #define NR(x) (sizeof(x)/sizeof(x[原创 2017-09-14 23:06:54 · 1264 阅读 · 0 评论 -
找工作笔试面试经验总结(C语言基础部分)
2017年9月14号,辞去了在伟易达的工作,怎么说,待了两年了,提辞职不太好说出口,但人各有志,我还是希望能去外面接触更多的东西,也希望能够多认识一些人,丰富我的社交经验。 纵观好几个公司的笔试面试经验,都考得比较简单,笔试和面试不会是那种特别难的题目,基本上都是基础知识,所以我一再告诉我的师弟师妹,出来工作,除了一些比较牛逼的公司出的题比较异类以外,其余的绝大多数公司,考的题目都是比较基础的,所原创 2017-09-23 14:24:01 · 2642 阅读 · 5 评论 -
更新进度条C语言实现
受了李大神这篇文章的启发:http://blog.youkuaiyun.com/absurd/article/details/761943于是我也自己亲手实现了一个简易版本的更新进度条,只要传入一个大于100的整型数即可。#include #include #include //定义设置光标结构体变量 CONSOLE_CURSOR_INFO cci; //定义默认的坐标位置 CO原创 2017-09-27 12:04:35 · 1322 阅读 · 0 评论 -
数组和指针一道非常值得深思的笔试题
最近笔试就遇到下面这道题,谁都不敢说自己的C/C++能有多精通,当然,工作一久,很多老毛病也就容易犯了,所以说,理论是真的很重要的,下面这道题,说实话还是挺基础的,虽然当时笔试被我给猜对了,但还是要深究一下具体的转换细节。如题:#include int main(void){ char *str[] = {"ab","cd","ef","gh","ij","kl"}; char *t ;原创 2017-12-24 14:42:30 · 2635 阅读 · 10 评论 -
C语言宏定义的妙用之法
最近看了intel在linux内核中的驱动,学习到了一个非常有用的小技巧,如下代码:#define IN#define OUT#define UAdress volatile unsigned int *#define Raw_buffer void *void SetHwiPortsDataReg(IN UAdress Register , IN int value){ _SetH...原创 2018-02-09 10:51:36 · 1177 阅读 · 2 评论 -
C语言实现时间差计算
在很多情况下,为了评判某个算法,函数的优劣,特别是比较同一个功能的两个函数的效率高低时,我们经常通过计算耗费时间作为判断标准。C语言中有两个相关的函数用来计算时间差,分别是:time_t time( time_t *t) 与 clock_t clock(void)头文件: time.h计算的时间单位分别为: s , ms time_t 和 clock_t 是函数库time.h 中定义的用来...转载 2018-03-01 16:53:05 · 20150 阅读 · 0 评论 -
C语言结构体深度剖析
做了挺久的开发,对于C这种东西,我不敢说自己已经精通了,毕竟还是有许多细节在学习的过程中会遗忘,然后再通过实践慢慢去一点点捡回来。所以只能算是熟练级别。 Linux内核的实现博大精深,从offsetof的实现到后面的container_of,为什么通过结构体的的成员就能获得整个结构体的指针呢?这就得益于offsetof宏的实现。关于这个宏,前面的博文也有讲解,但不够深入,今天的这个例子,足原创 2017-08-28 10:38:22 · 1596 阅读 · 1 评论 -
设计一条简单的等待工作队列之软件模型设计与实现(一)
队列遵循先进先出,那么其实跟链表的尾插就类似的,正好,利用这个特性,可以实现一个简单的等待队列程序软件框架,设计这条队列时,我们依然还是会使用头节点这个东西,但是它在队列中只是存储关键数据,并不是真正意义上的节点,可以将它忽略。这个等待队列可以设计为以下数据结构:工作者结构+基本队列链式结构所以可以设计出以下结构体://工作者结构typedef struct __work_st{ //工作者原创 2017-09-01 00:11:00 · 1478 阅读 · 0 评论 -
设计一条简单的等待工作队列之软件模型设计与实现(二)
上节用单链表实现了一条最简单的线程等待工作队列。http://blog.youkuaiyun.com/morixinguan/article/details/77758206但设计还有诸多因素需要考虑和改进,例如以下:void print(queue_list *header){ int count = 0 ; while(1) { sleep(1); printf("工作队列 work_se原创 2017-09-02 00:36:44 · 1109 阅读 · 0 评论 -
C语言实现一个Window控制台带彩色,且可以用方向键选择并确认的菜单式列表(一)
在Linux的编程里,管理列表的形式,我们可以使用VT100控制码来进行实现。因为VT100控制码在printf函数中就可以设置显示的行和列,这样实现一个列表选择的GUI界面就非常容易。比如Linux内核中的Make menuconfig。我们可以看到像下面这样的GUI菜单式界面,这样的界面用Linux VT100控制码结合C语言是很容易就可以实现出来的。那么,在Window上想要在控制台实现类似原创 2017-08-22 20:45:16 · 10717 阅读 · 9 评论 -
C语言实现一个Window控制台带彩色,且可以用方向键选择并确认的菜单式列表(二) ---学生信息管理系统
http://blog.youkuaiyun.com/morixinguan/article/details/77485367上节,我们写了一个简单的列表框架,是关于学生信息管理系统的,这节,我们来把它尽量的完善一下。目前,我这边已经除了学生信息修改以及学生信息删除还没有做好,其余功能以及可以正常使用,我们来看看程序的实现,往后更新了这两个接口,会将本文继续修改。我们来看看代码的实现:student_proj原创 2017-08-23 00:27:19 · 2388 阅读 · 2 评论 -
C语言实现数组的循环左移,右移,翻转
数组结合指针可以实现很多有趣的功能,比如下面这个程序:假设数组为 : 12345如果左移一次即为:23451 ,依次类推如果右移一次即为:51234 ,依次类推翻转则为:54321我们来实现下这个程序:#include #include #include #define NR(x) (sizeof(x)/sizeof(x[0]))//数组左移 int buffer_left_move原创 2017-08-22 15:57:01 · 11812 阅读 · 1 评论 -
一步一步教你从零开始写C语言链表
完整源码获取:微信关注:嵌入式开发圈发送"链表"即可获取。为什么要学习链表?链表主要有以下几大特性:1、解决数组无法存储多种数据类型的问题。2、解决数组中,元素个数无法改变的限制(C99的变长数组,C++也有变长数组可以实现)。3、数组移动元素的过程中,要对元素进行大范围的移动,很耗时间,效率也不高。先来感性的认识一下链表,我们先来认识下简单的链表:从这幅图我们...原创 2017-04-02 14:34:39 · 180838 阅读 · 90 评论 -
C语言用fstat函数获取文件的大小
之前获取文件大小总是用死办法,open一个文件,然后lseek,read这样去获取文件的大小,这样的效率实在是低,还有可能粗心大意还会出错。一次偶然在Android的源代码中看到获取文件大小的函数,在以下范例中。用fstat这个函数可以避免这些问题。参考百度:http://baike.baidu.com/link?url=wh6msZkLUlTCx8P6YzujB3YoHaLLVaO68sQIIP原创 2017-06-24 01:10:13 · 7156 阅读 · 2 评论 -
strtok函数的应用
strtok函数是字符串函数库中的一个函数,函数原型如下:char *strtok(char s[], const char *delim);作用:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。例如:"hello,hi:what?is!the.matter;" 把这串字符串传入strtok函数,第二个delim写 ",:?!.;" , 这样就可以得到6个不同的子字符串。我们原创 2017-08-17 16:39:05 · 722 阅读 · 0 评论 -
C语言结构体数组同时赋值的另类用法
说到C语言结构体数组的同时赋值,许多人一想就会想到用以下的这种方法,咱们来写一个例子:#include struct student{ int a; int b ; int c ; };struct student array1[1000] ;int main(void){ int i ; for(i = 0 ; i < 1000 ; i++) { array[i]原创 2017-08-21 22:43:04 · 7774 阅读 · 2 评论 -
C语言结构体位段特性实现断言宏
关于位段的特性这里就不多说了,多去看看相应的C语言书籍都会有介绍了。今天来介绍断言宏。什么是断言宏?断言宏可以认为是校验数据范围的有效性的一个宏的实现。我们来看看代码:#include //结构体位段#define CHECK(x) sizeof(struct {unsigned:(-!!(x));})//检查常量是否在一定范围之内,如果不在范围之内,则编译报错原创 2017-08-21 23:23:27 · 1501 阅读 · 0 评论 -
C语言字符串的另类用法
讲这个例子前,咱们先来看一个简单的程序:字符串数组实现数字转字母:#include #include int main(void){ int num = 15 ; //26个字母 const char str[] = "abcdefghijklmnopqlstuvwxyz" ; //这个做法是将num这个十进制数通过取模转换为字母并输出,从程序看,即可知道是输出p char a原创 2017-08-16 15:19:17 · 976 阅读 · 0 评论 -
C++友元函数实现
友元函数是一种特殊的函数,它必须要在类中进行声明,但其本身并不是类的成员函数,但友元函数可以访问类的私有成员变量。友元函数的好处:1、实现类之间的数据共享2、提高程序运行效率,方便编程友元函数的坏处:1、破坏数据的隐蔽性和类的封装性2、降低了程序的可维护性所有,友元函数应当谨慎的去使用它。实例:#include #include using namespace std ; class Stu原创 2017-07-11 12:00:10 · 1915 阅读 · 0 评论 -
将二进制转换为其它进制(这里转化为16进制,其它自己尝试)
代码很简单,看看就懂了,没什么好说的,就是一些位操作。#include #define LongToBin(n) \( \((n >> 21) & 0x80) | \((n >> 18) & 0x40) | \((n >> 15) & 0x20) | \((n >> 12) & 0x10) | \((n >> 9) & 0x08) | \((n原创 2016-10-06 17:26:37 · 1928 阅读 · 0 评论 -
BCD码与16进制互转算法
关于这类算法,以前的文章已经讲过类似的:BCD码转二进制#include // HEX转BCD//bcd_data(0)unsigned char BCD2HEX(unsigned int bcd_data){ unsigned char temp; temp=((bcd_data>>8)*100)|((bcd_data>>4)*10)|(bcd_data&0x0f);原创 2016-10-06 17:39:23 · 12940 阅读 · 1 评论 -
自守数算法----C语言实现
#include //自守数算法//ep : 25 ^ 2 = 625 76 ^ 2 = 5776 9376 ^ 2 = 87909376/*ep : * 376 被乘数 * *376 乘数 * ------ --------- * 2256 第一个部分积=被乘数*乘数的倒数第一位 * 2632 第二个部分积=被乘数*原创 2016-10-12 11:22:33 · 4140 阅读 · 2 评论 -
C控制台实现模拟平抛运动算法
#include #include #include #include #include #include int main(void){ float v0 = 0.01 ; float g = 9.8 , t , x , s = 0.0, y; int j ,k , temp; for(t = 0 ; t < 10 ; t++) {原创 2016-10-12 17:40:04 · 2450 阅读 · 2 评论 -
如何将一个二进制的xxx.bin文件轻松转为C语言数组
今天在写一个SPI-flash读写程序,目的是要将一个二进制文件写到SPI_FLASH中,最后通过开机读取,实际上这个.bin文件就是uboot和second-boot的结合体。通过SD卡写到SPI-FLASH中就可以脱离SD卡开机启动了。 这个程序的后半部分参考了以前的文章:http://blog.youkuaiyun.com/morixinguan/article/details/50646738原创 2016-12-16 23:50:35 · 17439 阅读 · 1 评论 -
利用strstr与atoi的结合实现一个C语言获取文件中数据的工具
源代码如下:#include #include #include #include #include int get_buf_data(char *buf,char *data){ char *p1 =NULL,* p2=NULL; int num =0; p1 = buf; p2 = strstr(p1,data); if(p2 == NULL)原创 2017-01-05 14:53:04 · 904 阅读 · 0 评论 -
结构体对齐的方式(自动对齐和手动对齐)
#include //默认情况下,结构体一般在内存中的自动对齐格式是4个字节 //结构体设置手动对齐 //如果这里是4,那么下面的打印就是8 //如果这里是2,那么下面的打印就是6 //如果这里是1,那么下面的打印就是5 #pragma pack(4)struct mystu{ char a ; int b ;};#pragma pack()int原创 2017-01-09 12:05:25 · 2832 阅读 · 0 评论 -
offsetof宏的原理以及作用
原理:虚拟一个TYPE类型的结构体变量,通过TYPE.MEMBER的方式来访问MEMBER成员,进而得到MEMBER成员相对于整个结构体首地址的偏移量。作用:为接下来的container_of宏的讲解出现做铺垫offsetof宏: #define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)接下来看看例程就明白了,其实这个宏挺简单的,&((T原创 2017-01-09 16:50:49 · 1825 阅读 · 0 评论