Engineer-Bruce_Yang
本科毕业于华南理工大学,美国Carroll University工商管理硕士,曾就职于世界名企伟易达,安防军工砺剑防卫公司,多年嵌入式产品开发经验,在智能玩具、安防产品、平板电脑、手机开发有丰富的实战开发经验。
展开
-
浅析结构体函数指针与内核设备驱动
最近在公司没什么事做,突然有来写写日志和博客,这种突发的灵感来自于我在学习内核驱动代码的时候发现了结构体的一种古老的初始化方法,多亏了尚观广州校区的叶老师在群里用心的给我文字讲解,让我明白了原来结构体初始化也可以用:冒号这样的方法。 其实在C语言中,冒号:的用法有很多,比如三目运算符 表达式?表达式1:表达式2 ;它的意思就是如果表达式成立,那么执行表达式1原创 2015-12-28 22:27:51 · 3086 阅读 · 1 评论 -
android从应用到驱动之—camera(1)---程序调用流程
一、开篇写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧.话说camera模块,从上层到底层一共包含着这么几个部分:1、apk------java语言2、camera的java接口----java语言3、camera的java接口的具体实现,即所谓的JNI-----(java—>C++)4、camera客户端-----C++语言5、cam转载 2016-01-18 15:19:35 · 1149 阅读 · 0 评论 -
浅谈C之精华---指针
今天是2016年的第一天,祝大家元旦快乐!哎,今天有点倒霉,代码写到一半,突然机子就没电了,幸好有保存,否则今天没有这篇日志的出现。 好了,今天以我个人的角度来深度剖析一下C语言中关于指针的用法以及注意事项,曾经我也是被指针坑得不要不要的,当然现在依然还是再被指针坑,因为指针用起来有很多细节的地方要注意。好了,废话不多说,我们来看看指针到底什么地方难!!!原创 2016-01-02 00:02:33 · 3215 阅读 · 0 评论 -
C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下。记得读大学的时候,老师就告诉我们说,C语言是一门面向过程的语言,C++,java,C#是面向对象的语言。C++有三个最重要的特点,即继承、封装、多态。等到后来随着编码的增多和工作经验的积累,我也慢慢明白了面向对象的含义。可是,等我转载 2016-01-19 21:41:58 · 1521 阅读 · 0 评论 -
C语言如何分离一个数的高低位,如何将2个字节变成一个字节
关于这个概念,是我从工作中学习的,虽然在读书的时候就应该要掌握,但是在开发中,这项技能尤其重要。我是做嵌入式开发的,在嵌入式开发过程中,如何对数据操作必然是不可缺少的问题,接下来,我们来看一个例子:1.#include <stdio.h>int main(void){ unsigned int temp = 0x10 ; unsigned int high = (...原创 2015-12-19 10:16:17 · 57023 阅读 · 4 评论 -
linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)
学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从linux内核源码的kernel.c中抠出来的代码,我们来看看:我们直接上代码:#include #include /* * min()/max() macros that also d原创 2016-01-21 20:51:38 · 1662 阅读 · 0 评论 -
对嵌入式开发C语言结构体的一点总结
今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说。直接看下文:鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少。话说,基础什么的比你会更牛逼的算法更重要,基础不牢,地动山摇!!最本质的东西就是基础,不要学到越高级的东西却忘了最本质的东西,这样就失去了学习的意义。接下来我将对结构体最基础的东西,如何初始化,如果打印信息做一个最基础的总结,当然结构体在内核中到原创 2015-12-22 12:21:23 · 3152 阅读 · 1 评论 -
Linux内核中SPI总线驱动分析
本文主要有两个大的模块:一个是SPI总线驱动的分析 (研究了具体实现的过程);另一个是SPI总线驱动的编写(不用研究具体的实现过程)。 1 SPI概述 SPI是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,A转载 2016-01-09 11:34:58 · 1288 阅读 · 0 评论 -
C语言获取系统时间的函数
在标准C编程中,我们如何写程序来获取当前系统的时间呢?获取系统时间的函数#include time_t time(time_t *t)参数:如果参数不为空,那么返回值会存储一份到t所指向的空间中,参数本身是可以为空的返回值:成功返回系统时间(秒数) , 失败返回-1 。我们上代码:#include#includeint main(){原创 2016-02-05 15:06:51 · 6138 阅读 · 4 评论 -
C语言关键字static的绝妙用途
为什么要说static妙,它确实是妙,在软件开发或者单片机开发过程中,大家总以为static就是一个静态变量,在变量类型的前面加上就自动清0了,还有就是加上static关键字的,不管是变量还是关键字,在局部变量中,变量仅限于局部可见,在全局区中,static变量或函数仅限于本文件可见,当然还有一个重要的特性被忽略了。。。。 就是static修饰的局部变量 它的数值 是上一次函数调用结原创 2016-02-05 15:22:54 · 5072 阅读 · 0 评论 -
深度剖析linux内核万能--双向链表,Hash链表模版
我们都知道,链表是数据结构中用得最广泛的一种数据结构,对于数据结构,有顺序存储,数组就是一种。有链式存储,链表算一种。当然还有索引式的,散列式的,各种风格的说法,叫法层出不穷,但是万变不离其中,只要知道什么场合用什么样的数据结构,那就行了。那么,标题说的内核万能链表,其实就是内核链表,它到底和我们平常大学学的数据结构的链表有什么不同呢??内核链表,是在linux内核里的一种普遍存在的数据结构,原创 2016-01-28 20:48:10 · 4817 阅读 · 2 评论 -
C语言之数值计算--级数算法
在编程语言的学习中,我们学习过不少的算法,比如累加,累乘,数值交换,排序等等。在一些软件比赛和面试题中,有一类算法不容忽视,属于高频题目,我之前去企业面试的时候就遇到这样的一类题目,题目不算难,掌握方法,很快可以做出来。这类算法叫做----级数算法。级数计算的关键是“描述出通项”,而通项的描述法有两种:一为直接法、二为间接法又称递推法。直接法的要领是:利用项次直接写出通项式;递推法的要原创 2016-02-06 11:13:08 · 5303 阅读 · 0 评论 -
曾经进公司面试的C语言有关指针和数组的笔试题
原题如下:#include int main(void){ int i , j ; unsigned int Array_A[32]; unsigned int *pPointer; i = 0x0008 ; //测试i printf("i=%d\n",i) ; pPointer = Array_A ; *(pPointer++)=i++ ; //测试i pr原创 2016-02-06 20:51:25 · 2958 阅读 · 0 评论 -
C语言之选择排序
选择法排序是相对好理解的排序算法。假设要对含有n个数的序列进行升序排列,算法步骤是:1、从数组存放的n个数中找出最小数的下标(算法见下面的“求最值”),然后将最小数与第1个数交换位置;2、除第1个数以外,再从其余n-1个数中找出最小数(即n个数中的次小数)的下标,将此数与第2个数交换位置;3、重复步骤1 n-1趟,即可完成所求。好了,接下来看代码:#include原创 2016-02-09 19:49:01 · 6121 阅读 · 0 评论 -
C语言之插入排序
插入法排序的要领就是每读入一个数立即插入到最终存放的数组中,每次插入都使得该数组有序。上代码:#include #include #define n 10 int main(){ int a[n]={-1,3,6,9,13,22,27,32,49}; /*注意留一个空间给待插数*/ int x,j,k; x = rand()%100; print原创 2016-02-09 19:58:29 · 2372 阅读 · 0 评论 -
C语言之归并排序
即将两个都升序(或降序)排列的数据序列合并成一个仍按原序排列的序列。上代码:#include #include #define m 6#define n 4int main(){ int a[m]={-3,6,19,26,68,100} ,b[n]={8,10,12,22}; int i,j,k,c[m+n]; int l ; i=j=k=0;原创 2016-02-09 20:07:37 · 3975 阅读 · 0 评论 -
C语言实现牛顿迭代法解方程
利用迭代算法解决问题,需要做好以下三个方面的工作:一、确定迭代变量在可以用迭代算法解决的问题中,我们可以确定至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。二、建立迭代关系式所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。三、对迭代过程原创 2016-02-09 23:28:04 · 36585 阅读 · 2 评论 -
浅析数据结构中栈与C实现
最近在搞摄像头驱动,o()︿︶)o 唉,别提有多烦,一堆寄存器就有人受的了……特么这不是单片机的开发,这是内核驱动开发……今天放松一下,我们来看看数据结构中的栈,这节的知识点可以说是数据结构中最容易上手的知识点了,其实比起链表,其实链表也有栈和队列的模型,链表的头插其实就是后进先出,链表的尾插其实就是先进先出,这不就是栈和队列吗,哈哈,不知道学习数据结构的时候有没有意识到这原创 2016-01-12 22:04:01 · 1467 阅读 · 0 评论 -
C语言字符串的常见特殊操作(除了string.c实现的那些接口)
字符串操作中,必须掌握的一些之前已经在文章有写过了,比如说字符串查找,字符串粘帖,字符串拷贝等等,这些在标准C库的string.c中已经有实现,故包含#include 就可以使用了。 除了上述所说的接口,还有一些在工作中常用的接口,比如:从字符串中删除指定的字符,删除字符串的第一个字符,将字符串左右翻转等等,今天就挑几个这样的接口来说一下:我们直接上代码:#include原创 2016-02-15 21:35:24 · 2592 阅读 · 0 评论 -
不用局部变量实现C语言两数交换算法
关于交换算法,我想非常简单,所以,这次不做分析,直接上代码:#include #include //用异或方式实现void swap(int *a,int *b){ *a^=*b; *b^=*a; *a^=*b; } //用指针加减运算的方式实现void swap1(int *a,int *b){ *a+=*b; *原创 2016-02-15 21:42:21 · 1965 阅读 · 0 评论 -
C语言之回文数算法
“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。 设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。原创 2016-02-15 21:51:09 · 12855 阅读 · 0 评论 -
C语言之鞍点的查找
鞍点(Saddle point)在微分方程中,沿着某一方向是稳定的,另一条方向是不稳定的奇点,叫做鞍点。在泛函中,既不是极大值点也不是极小值点的临界点,叫做鞍点。在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点。在物理上要广泛一些,指在一个方向是极大值,另一个方向是极小值的点。接下来,我们直接上代码:#include#define M 4#define N 3in原创 2016-02-13 11:46:24 · 6337 阅读 · 0 评论 -
C语言笔试经典-查找多位数重复数字以及次数
从键盘输入一个多位的整数 用程序判断 这个数里面有没有 重复的数字 有重复的数字就打印 哪个数字重复了 重复了几次 例如:输入:1122431 打印结果: 1重复 出现3次 2重复 出现2次, 上代码:#include//查找多位数 重复数字 以及次数int main(){ long n=0; printf(原创 2016-02-16 15:00:31 · 6152 阅读 · 0 评论 -
C语言笔试经典--求分数数列的和
题目: 求数组的和 2 3/2 5/3 8/5 13/8 21/13 ... 求前20项的和 //求分数数列的和#include// 2/1 3/2 5/3 8/5 13/8 ... int main(){ float z=2; float m=1; float sum=0; int i=0;原创 2016-02-16 15:06:21 · 2546 阅读 · 0 评论 -
linux内核算法---hex_to_bin分享
这是我从内核抠出来的一段代码,用处就是传入一个字符,即可以用printf语句%d以十进制数的格式输出,同时也可以以%p地址的形式输出。 代码如下:#include #include #include #define tolower(c) __tolower(c)#define toupper(c) __toupper(c)static inline un原创 2016-02-04 13:40:19 · 2480 阅读 · 0 评论 -
linux内核中的排序接口--sort函数
linux内核中的sort函数,其实跟我们所说的qsort函数很像,我们来看看qsort:qsort 的函数原型是void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));参数: 1 、待排序数组首地址2 、数组中待排序元素数原创 2016-02-17 20:34:42 · 5249 阅读 · 3 评论 -
C语言之linux内核实现位数高低位互换
linux内核实在是博大精深,有很多优秀的算法,我之前在工作中就遇到过位数高低位交换的问题,那时候对于C语言还不是很熟练,想了很久才写出来。最近在看内核的时候看到有内核的工程师实现了这样的算法,和我之前想的一样,那么今天就把它分享出来吧。 在开发需求中,有要实现32位、16位、8位数高低位交换的算法。那么我们具体看看代码实现:还是一样,从linux内核中将代码抠出来:#inc原创 2016-02-17 21:01:28 · 6327 阅读 · 0 评论 -
C语言之linux内核实现平方根计算算法
关于平方根的计算,在linux内核中也有实现,就像math.h数学库里的sqrt这个函数一样。 平方根的公式定义:如果一个非负数x的平方等于a,即 , ,那么这个非负数x叫做a的算术平方根。a的算术平方根记为 ,读作“根号a”,a叫做被开方数(radicand)。求一个非负数a的平方根的运算叫做开平方。结论:被开方数越大,对应的算原创 2016-02-17 21:50:37 · 7465 阅读 · 0 评论 -
C语言实现字符串中(10进制和16进制)转成十进制数
如何将字符串中的10进制数和16进制数提取出来,看以下代码:#include typedef char TUINT8 ;typedef int TUINT32;TUINT32 Read_DecNumber(const TUINT8* str);TUINT32 Read_HexNumber(const TUINT8* str); int main(void){ int ret原创 2016-02-17 22:06:51 · 10500 阅读 · 0 评论 -
关于嵌入式如何学习(看了不后悔,给学技术的同行一条光明的路)
关于嵌入式如何学习,我相信有很多大牛回答得很专业,最近在知乎上看到一网名为----李brooks,~的网友对此进行了总结,我个人觉得非常好,还有其他两位网友li crifan和Tony Ho,毕竟我工作以来也还有好多东西没有接触,就有他说的那些中的部分内容,我们来看看他们说了什么内容:有一位大学生四年级的网友提出这样的问题:本人大四学生,专业为电气类的,有C语言,单片机,模电,数电原创 2016-02-18 10:21:37 · 48046 阅读 · 12 评论 -
C语言之linux内核--BCD码转二进制与二进制转BCD码(笔试经典)
在分析代码之前,我们先来了解一下,BCD码和二进制到底区别在哪? 学习过计算机原理的和数字电子技术这两门课的都会知道这两个到底是什么含义,也有的同学学过了,考过了,过了一段时间又忘记了,今天,我们通过一个代码案例来说说: 我们先查查百度,了解一下BCD码:BCD码(Binary-Coded Decimal)亦称二进码十进数或二-十进制代码。用4位二进制数来表原创 2016-02-17 21:24:25 · 9291 阅读 · 0 评论 -
网络最短路径Dijkstra算法
最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记:/** File: shortest.c* Description: 网络中两点最短路径 Dijkstra 算法* Shortest Path Dijkstra Algorithm* Created: 2001/11/25* Author: Justin Hou [mailto:ju原创 2016-03-16 22:42:46 · 5057 阅读 · 0 评论 -
动态规划算法计算网络的最长路线和最短路线
/** File: longest.c* Desciption: 动态规划算法计算网络的最长路线和最短路线* Created: 2001/12/2* Author: Justin Hou [mailto:justin_hou@hotmail.com]**/#include #define N 7原创 2016-03-16 22:47:28 · 4380 阅读 · 0 评论 -
C语言之实现随机数产生算法
随机数,也就是在不同的时刻产生不同的数值。在UNIX操作系统和window的操作系统上,我们知道有一个函数rand,它就是用来产生随机数的函数API接口,那么它的原理如何实现?如果约定a1=f(seed),an+1=f(an),那么可以得到一个序列a1,a2,a3..an,那么要制作一个伪随机函数rand,只需要让它每调用一次就返回序列的下一个元素就行。其实就是相当于第1次调用rand返回a1原创 2016-02-20 15:50:51 · 17282 阅读 · 0 评论 -
数据结构之---二叉树C实现
学过数据结构的都知道树,那么什么是树?树(tree)是包含n(n>0)个结点的有穷集,其中:(1)每个元素称为结点(node);(2)有一个特定的结点被称为根结点或树根(root)。(3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1树也可以这样定义:树是由根结点和若干颗子树构成的。树原创 2016-03-06 20:33:57 · 7193 阅读 · 0 评论 -
C语言之linux内核实现最大公约数算法
最大公约数算法,又称欧几里德算法,至今已有几千年的历史了。在我们开始学习C语言的时候最常用的算法就是辗转相除法,其实在linux内核中,内核也是使用这样的方法实现两数最大公约数的计算。 两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。 例如,252和105的最大公约数是21(2...原创 2016-02-17 21:34:55 · 1262 阅读 · 0 评论 -
蒙特卡洛算法
从今天开始要研究Sampling Methods,主要是MCMC算法。本文是开篇文章,先来了解蒙特卡洛算法。 文章转载自:http://blog.csdn.net/acdreamers/article/details/44978591 Contents 1. 蒙特卡洛介绍 2. 蒙特卡洛的应用 3. 蒙特卡洛积分转载 2016-03-18 22:47:56 · 4443 阅读 · 0 评论 -
数据段、代码段、堆栈段、BSS段的区别
最近在复习一些以前的知识点,整理了一些相关的基本概念,以下的概念网上有博客已经提出了,在此我将这些知识点进行总结:5个数据段 进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一原创 2016-03-18 23:09:21 · 7397 阅读 · 0 评论 -
利用可变参实现fprintf函数
#include #include /* 可变参相关接口 typedef char * va_list ; void va_start (va_list ap , prev_param) ;type va_arg(va_list ap , type) ;void va_end(va_list ap); */int myfprintf(FILE* fp, char* fmt, ..原创 2016-02-22 20:26:35 · 3369 阅读 · 3 评论 -
linu下C语言之BMP图片操作编程(上)
BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备。 微软已经定义了一个特定的表示颜色的位图 不同的颜色深度,作为援助交换设备和之间的位图 应用程序与各种各样的内部表示。 他们称这些 与设备无关的位图或权利,叫做DIB文件格式 文件格式或BMP图像文件格式。 根据微原创 2016-02-22 22:50:47 · 4970 阅读 · 9 评论