编程开发
寒江独钓2009
嵌入式软件开发,C语言编程,USB、IIC、SPI、SD、串口开发,存储芯片开发。系统启动引导开发,Linux内核驱动开发。
展开
-
一种usb转串口热拔插支持方法
硬件上来说,可热插拔的设备一般都会对电源部分格外重视,除了包含防止插拔的过程中对正负极可能造成的意外短路之外,热插拔还要保证电源负极先于其他引脚连接进系统,提供ESD放电回路。然后连接进的是电源正极,为系统供电。稍稍延时后,再将整个电路连接进主系统。尽量确保在数据线上不会产生有害的浪涌损坏设备。而对于DB9串口来说,它的所有脚是同时引入系统的。而且在接口电路中没有任何保护措施,这样的话在热插拔之后,可能会对系统造成不良影响甚至损坏系统。 软件方面,以USB为例。操作系统对于USB设备有着非...原创 2020-12-01 10:01:02 · 1191 阅读 · 0 评论 -
介绍一下内存泄漏工具valgrind的使用
valgrind是一款开源内存检测的工具,里面包含了很多的工具,一般使用Memcheck这个工具偏多;Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。注:代码编译时我们要带上参数-g,有了符号表才可以显示行号这些东西;valgrind工具命令参考:valgrind --tool=memcheck --leak-check=full --show-..原创 2020-09-15 15:39:38 · 410 阅读 · 0 评论 -
Linux内核调试之lsof命令和fuser命令
lsof命令简介:lsof(list open files)是一个列出当前系统打开文件的工具。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以,lsof的功能很强大。一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,但是普通用户执行会显示“permission denied”。因此通过lso原创 2017-05-13 09:44:10 · 4651 阅读 · 0 评论 -
使用/dev/uinput的简要介绍(含demo程序)
uinput机制有2个很大的优点:1) 不用自己写驱动(比如弄个红外遥控器、车载线控)。2) 创建/dev/input/eventX节点,在用户态下向/dev/input/eventX写入事件,即可模拟键盘、鼠标等的事件输入。操作流程:1)打开UInput Device2)设置UInput Device3)写入设备信息4)创建Input Devi原创 2017-07-15 08:47:41 · 5260 阅读 · 4 评论 -
一个移植十分方便的malloc函数族的实现
相信学习过c语言的人都知道malloc、free函数,这里就不多说怎么用了。这里要说的是:提供它们的实现。 该实现方法由uboot中malloc等函数的实现改编而来。已经过验证,没有问题。 ------多说一句,该实现支持物理地址malloc、free。。。,不支持虚拟地址的映射 该malloc的源码实现,很方便移植。特别是在BootLoader或者单片机开发过程中,原创 2017-08-05 08:57:06 · 5985 阅读 · 0 评论 -
程序员提问的智慧(How-To-Ask-Questions-The-Smart-Way)
提问的智慧How To Ask Questions The Smart WayCopyright © 2001,2006,2014 Eric S. Raymond, Rick Moen本指南英文版版权为 Eric S. Raymond, Rick Moen 所有。原文网址:http://www.catb.org/~esr/faqs/smart-questions.h原创 2017-09-16 08:32:11 · 1937 阅读 · 0 评论 -
linux块设备驱动程序示例(适用于高版本内核3.16.0 - 3.19.0等,亲测可用)
1. 字符设备与块设备的 I/O 操作主要有如下不同点: (1)块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位。大多数设备是字符设备,因为它们不需要缓冲而且不以固定块大小进行操作。 (2)块设备对于 I/O 请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设备无须缓冲且被直接读写。对于存储设备而言调整读写的顺序作用巨大,因为在读写连续的扇区比分离的扇区更快...原创 2018-03-16 07:21:46 · 1848 阅读 · 1 评论 -
一种编译时自动生成时间来实现软件版本管理的方法
多数情况下,我们在进行软件版本的迭代更新时,除了定义软件版本号外,还会定义个编译的时间点。但是如果通过数组定义编译时间,每次编译我们都需要手动修改,非常麻烦,而且有时候,还会忘记。其实我们不需要这么复杂,编译器一般都会提供一个宏用于自动获取编译时间。例进行说明:ANSIC标准定义了以下6种可供C语言使用的预定义宏: __LINE__ ...原创 2018-03-19 20:56:43 · 1454 阅读 · 1 评论 -
关于gcc的扩展宏定义中, "#" 和 "##"的含义
"#" 代表和一个字符串相连接 "##" 代表和一个符号相连接,符号可以是变量,或另一个宏符号举例如下:#include<stdio.h>#define FILE_NAME "/dev/tty"#define FILE_NAME2 "/dev/console"// '#' use example#define FILE_OPEN1(fd,n) \{ \ fd =...原创 2018-03-19 22:10:18 · 1840 阅读 · 0 评论 -
关于int open(char *filename, int flags, mode_t mode); 的flags参数说明
这里写自定义目录标题关于int open(char *filename, int flags, mode_t mode); 的参数flags:关于int open(char *filename, int flags, mode_t mode); 的参数flags:O_RDONLY :没有文件时返回 -1;有文件时跳过,并且保留文件原来内容O_WRONLY :没有文件时返回 -1;有文件时跳过...原创 2019-02-22 23:39:24 · 2004 阅读 · 0 评论 -
Linux pinctrl子系统框架流程详解(基于Kernel 3.16,arm,设备树)
以下讲的pinctrl子系统框架包括3点,1. pinctrl子系统简介;2.pinctrl子系统的注册;3. 设备驱动匹配时,probe执行前的管脚自动配置。写博客不易,如若转载,请注明出处。一、pinctrl子系统简介 在arm的各种soc芯片中,往往可以看到1个pin引脚,既可以作为GPIO,也可以作为spi、i2c、uart总线中的1根引脚,即该引脚是可以复用为不同功...原创 2019-05-08 01:59:34 · 3268 阅读 · 3 评论 -
make modules_install指定ko安装路径
一句话,如下:make modules_install INSTALL_MOD_PATH=/home/ubuntu/WorkSpace/qemu-rootfs/lib/modules原创 2017-04-04 22:10:00 · 16795 阅读 · 3 评论 -
一张图看懂Linux内核的“总线-设备-驱动”架构中的设备、驱动函数调用
一张图看懂Linux内核的“总线-设备-驱动”架构中的设备、驱动函数调用:原创 2017-04-08 00:51:53 · 1712 阅读 · 1 评论 -
聊一聊单片机应用程序架构(深度好文)
对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不断增多,本人觉得架构是非常必要的。发现真正使用架构的并不多,而且这类书籍基本没有。好不容易找到份资料,可以参考:《谈谈怎样架构你的单片机程序》。 本人经过摸索实验,并总结,大致应用程序的架构有三种:1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直原创 2017-03-11 00:59:11 · 10165 阅读 · 5 评论 -
一个移植十分方便的类似printf函数,升级版
升级版,不包含任何头文件,“独立生存\(^o^)/~”。一个十分便于移植的类似printf函数,就当做printf使用就可以了(注:不支持浮点型数),已测试通过。只需要实现SendChar()函数,把你要外发的字符(比如:发送到串口,显示屏等)写在这里即可。供大家使用。打字不易,转载请注明出处,谢谢!//Printf.c/*---------------------------------原创 2016-05-05 01:32:47 · 758 阅读 · 1 评论 -
一个移植十分方便的类似printf函数
一个十分便于移植的类似printf函数,已测试通过。只需要实现SendChar()函数,把你要外发的字符(比如:发送到串口,显示屏等)写在这里即可。里面部分使用Renasas的源码,在这里尊重其版权。供大家使用,也请尊重我个人的辛勤汗水哈~源码如下:/*---------------------------------------------------------------------原创 2016-04-22 22:29:52 · 1158 阅读 · 0 评论 -
一个简要的示例说明Linux内核的container_of 的用法
一个简要的示例说明Linux内核的container_of 的用法,很简洁,不多说了,直接附上代码,自己gcc container_of.c -o container_of.out ; ./container_of.out 吧。如被转载,请附上原转载地址,谢谢!//container_of.c#include #ifdef __compiler_offseto原创 2016-04-23 11:47:25 · 682 阅读 · 0 评论 -
一个优秀的debug宏,更新
调试用的debug宏,更新。可以显示你debug所在的文件名,函数名,行号。例子里使用的是基于printf函数来做。纯c代码,不多说了,直接上源码://t.c#include #define MYDEBUG#ifdef MYDEBUG#define myDebug(fmt,...) printf("%s:%s:%05d=>"fmt"",__FILE__,__func__,__原创 2016-05-18 22:34:18 · 525 阅读 · 0 评论 -
一个优秀的debug函数(宏)
调试用的宏debug函数(宏),可以显示你debug所在的文件名,函数名,行号。例子里使用的是基于printf函数来做。纯c代码,不多说了,直接上源码://t.c#include #define debug(argc,argv...) ({printf("%s:%s:%05d=>",__FILE__,__func__,__LINE__);printf(argc,##argv); })原创 2016-04-24 10:26:53 · 4806 阅读 · 0 评论 -
全面了解 ARM CP15协处理器 (深度好文)
转载自:http://blog.chinaunix.net/uid-14114479-id-3110951.htmlARM926EJ-S/ARM920T 协处理器 CP14, CP15 详解 ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器转载 2016-07-02 17:22:32 · 5565 阅读 · 1 评论 -
汇编和c函数交叉混合调用
有转载的话希望能尊重原创,谢谢各位!以下运行在Ubuntu环境下,需要安装qemu-user,使用arm-linux-gcc编译。////////////////////////////////////////////////////////////////c文件中调用汇编文件中的汇编“函数”/////////////////////////////////////////////原创 2016-06-19 09:31:58 · 602 阅读 · 0 评论 -
一句printf搞定一个数组的矩阵输出。
今天在工作的时候,看到一位同事写的一个打印数组输出,矩阵格式的。写得一堆堆的。功能是实现了,但是代码个人感觉不太简洁。。。因此,自己也想了一下。做出了下面的方法,供大家参考。先看下怎么回事:打印输出格式示意:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2原创 2016-12-16 22:25:01 · 11709 阅读 · 1 评论 -
关于如何在make一个Linux下的C/C++工程时,自动添加版本号、编译日期等信息
本篇的目的:在makefile里,将系统当前的时间传递进待编译的C/C++工程中,用以指示编译执行的时间,以及版本信息等。不多说了,先来看效果:当前时间:编译完成后运行效果:。。。。。。过了3分钟后,再次编译运行:注意箭头指向的时间的变化。下面贴代码:这就是关于如何make一个Linux下的C/C++工程时,自动添原创 2017-01-20 00:35:23 · 8097 阅读 · 0 评论 -
使用gcc给待编译C/C++源码注入宏的2种方法
第一种方法:gcc “源码” -D“你要定义的宏” -o “可执行文件”示例源码://test.c:#include int main(int argc,char *argv[]){#ifdef ZKJprintf("===ZKJ has been defined===\n");#elseprintf("===ZKJ has not been defin原创 2017-01-21 16:33:39 · 1333 阅读 · 0 评论 -
c程序中多层if嵌套结构的几个优化方法(深度好文)
关于c程序中多层嵌套结构的优化方法,在百度中找来找去,发现写这方面的文章不多。下面就我个人总结出来的几个方法,写出来,与大家分享。也希望看到这篇文章的人,要是有更好的方法,也在底下评论留言。您的一点贡献,也许会帮到困扰中的程序员^_^。有什么不足,也麻烦指出来下,共同进步。最后,打字不易,希望转发的人,注明下原出处,谢谢!原创 2017-02-19 20:02:31 · 18890 阅读 · 2 评论 -
arm编程,关于C函数中嵌入汇编和寄存器变量的混合使用方法。用汇编透视c语法操作
arm编程,关于C函数中嵌入汇编和寄存器变量的混合使用方法,例子简单,但是十分有启迪作用,自己看就明白了,编译工具:arm-linux-gcc,方式:arm-linux-gcc -S main.c -o main.s。源码如下。编写不易,倘若转载,请注明下出处,谢谢!//main.c#include void main(void){ register int Regx asm("r原创 2016-04-29 00:26:44 · 927 阅读 · 1 评论