- 博客(108)
- 资源 (4)
- 收藏
- 关注

原创 blog说明
今后主要专注于arm系列芯片的嵌入式linux的各种有意思的东西! 个人blog基本上个人的一个学习笔记,见识有限,若有问题,欢迎大家指出。真诚的用开放的心态去交流。
2012-02-25 22:20:02
2537
1
原创 一步步玩pcDuino3--uboot下的ping,添加命令可以接受来自host的ping
uboot是一个非常优秀的开源项目。不仅仅可以学习bootloader,嵌入式,各种总线协议。还可以了解网络协议栈。在嵌入式开发中,经常使用uboot的tftp和nfs来加快开发的效率。那么在tftp可以使用之前,我们要保证host和pcDuino3可以ping通。在uboot下可以ping通host,但是host不能ping通uboot,这是因为uboot不是操作系统,我们需要做了个命令来循环等
2014-05-23 16:58:55
8735
原创 一步步玩pcDuino3--mmc下的bootloader
pcDuino3下支持mmc启动,官方的Uboot是采用SPL框架实现的,因为内部的SRAM空间达到32K,我们完全可以在这32K空间内编写一个完整可用小巧的bootloader来完成引导Linux kernel的目的。 我们首先介绍下SPL框架,可以先看下《GNU ARM汇编--(十八)u-boot-采用nand_spl方式的启动方法》和《GNU ARM汇编--(十九)u-boot
2014-05-19 16:23:17
10793
原创 一步步玩pcDuino3--mmc下的裸机流水灯
第一部分是玩pcduino3下的裸机,这个过程可以让我们更好的理解嵌入式系统,熟悉我们使用的这个平台。 首先介绍下开发环境:虚拟机:VMware® Workstation 10.0.2 build-1744117系统:Linux slackware 3.2.29-smp #2 SMP 交叉编译器:arm-linux-gnueabihf- 版本号:
2014-05-09 18:54:17
14123
原创 记录#pragma pack()的问题
在Cortex M0平台上做开发的时候,遇到一个纠结了两三天的问题。代码添加了PWM马达控制后,继续做USB复合设备。在做好USB复合设备,发现原来的PWM马达控制不起作用了,首先对比了模块的寄存器设置,完全一致,然后对比代码,除了USB部分,没有任何差别,接着尝试对比了bin档和map文件,发现二者最大的区别在于一个调用了uread.o中的__eabi_uread4函数和uwrite
2014-01-28 17:56:59
11666
原创 TortoiseSVN实现本地版本控制
以前组里做项目用过P4和SVN,装个客户端就很容易上手使用。最近一个人做一个项目,没有服务器进行代码管理,就得在自己的电脑中进行版本管理。 每有一次大的改动就建立新的文件备份实在太麻烦,想来想去还是在本地建立一个版本控制,方便自己,节省空间和时间。 因为本地已经有TortoiseSVN,在C:\SVN\Project目录下右键新建一个版本库然后再
2014-01-22 15:34:08
14876
4
原创 记录两个关于Qt的小问题
1.在程序如何使用qt的库,在解析ini文件格式时,Qt中的QSettings类可以很好的解析ini文件格式,ini文件格式简单,但是写个功能完善而且较强大的库还是要花点时间和功力的。在写代码时遇到这个问题,不想写自己的解析ini格式的类,想直接使用qt的库,结果发现Qt对ini格式无法真正的写入,记得刚刚写的有Gui的代码也使用了QSettings类,使用很正常。经过查找分析,发现仅仅链接qt的
2013-09-06 13:57:54
5499
原创 linux下使用getopt处理命令行
以前在linux的shell下运行程序时也带过参数,在参数的处理上是自己写个简单的解析函数来处理argv[]的,显得很麻烦而且笨拙。今天学习代码时才发现有个getopt函数可以轻松的处理命令行参数。难怪linux的那些程序的参数处理都做的很强大。比如ls -al --color=auto,ls --help。 首先用man 3 getopt看了下函数的手册,结合附带的代码还是
2013-03-15 18:55:52
8647
原创 slackware的一些常用配置
花了点时间在本子上装了slackware14 x86_64的,感觉还行。这次没有装linux和win的双系统,单跑slackware,然后在虚拟机中跑个xp,主要是为了网银的使用和解决office的兼容性问题。 slackware的安装比一般的发行版要复杂,但是对于比较熟悉linux的人来说还是可以搞定的。安装的时候用的是ultraiso制作的启动U盘,修改bios中改为U盘启动
2013-03-08 13:26:46
9248
原创 qt和linux下的input设备
在嵌入式开发中,qt的键盘往往都是特制的,如何让特制的键盘被qt用起来,需要对linux的input子系统有一定了解,并且特别要追一下qt对外界输入时间的处理方式。应用层和驱动层相互关联,在此仅先粗略分析下qt这部分: 在qt的源码中grep下/dev/input/event之类的,就可以顺藤摸瓜了对于qt的embedded版本,第一个运行的QApp当作server,后起来的QApp
2013-01-31 23:42:24
13620
原创 linux驱动实践(五)--linux下的按键驱动之查询方式
虽然好几个月之前就对linux下的阻塞,非阻塞,select poll的实现,工作队列,tasklet等等做了较为深入的分析,但是在遇到实际的硬件驱动中,才真正去思考怎么将这些用到实际中,构建一个稳定高效的驱动。 板子上有四个按键,linux内核中有input子系统来很好的完成这个事情。先按照自己的思路一步步来,最后看下人家input子系统是如何实现的,肯定有不少值得借鉴的。
2013-01-01 22:26:37
6210
原创 linux驱动实践(四)--linux下读写寄存器
arm裸机下读写寄存器很容易,各个寄存器和内存的地址是单一地址空间,他们是用相同的指令进行读写操作的.而在linux下就要复杂很多,因为linux支持多个体系架构的CPU。比如arm和x86就不一样,具体的差别我暂时也说不上来,这个涉及到CPU体系的设计。目前我只关心:linux为了支持多个硬件体系,在IO访问上做了自己的接口。可以通过IO内存和IO端口这两种方式进行IO访问。在LED的例子上给出
2012-12-23 23:22:01
21943
原创 linux驱动实践(三)--不大一般的LED驱动
看了这么多内核代码,终于要自己开始做驱动了.按照由易到难,由浅入深的顺序,就从LED开始. LED驱动可以说是hello world之后最简单的驱动模块了.如果自己写一个LED驱动那是很简单的,其实用linux内核中的leds子系统来做也是比较简单的,内核中的leds子系统是将led抽象成platform_device,并有leds_class.这样,在/sys/class/le
2012-12-18 17:33:54
12848
原创 linux驱动实践(二)--linux3.0.46移植和NFS根文件系统
将近两个月之前就准备开始了,但是在移植linux时候发现编译出来的Image有2.4M之大,而开发板提供的uboot最大只能烧写最大2M。所以本来准备跳过uboot的,但是如果自己不搞个好点的bootloader,我的kernel都烧不了。索性花了一个多月的时间移植了u-boot-2012.07,采用nand-spl方式启动的。可以支持tftp下载,那么我的开发流程就是用开发板自带的nor f
2012-12-10 21:36:44
6161
1
原创 GNU ARM汇编--(二十)总结
从这个系列第一篇开始,那是4月22号,到今天做一个总结,已经有7个多月的时间了,利用业余时间学习自己感兴趣的东西,进度比较慢,也是比较累的,但收获也是很多的. 这个系列之所以写出来,是因为自己在玩linux文件系统和驱动的时候,总是觉得自己应该回头看看bootloader到底是怎么工作的.本来只想着重新看下arm体系结构和汇编语言的,没想到一路上还学习了以前从没想过的编译链接的细
2012-12-01 15:13:01
8930
8
原创 GNU ARM汇编--(十九)u-boot-nand-spl启动过程分析
在理解bootloader后,花些时间重新学习了开源软件的makefile和相关脚本之后,自己的u-boot移植工作也比较顺利的完成了: 移植环境: ubuntu 12.04 U-Boot 2012.07 (Nov 28 2012 - 20:05:48) arm-none-linux-gnueabi-gcc (Sourcery
2012-12-01 14:25:43
11699
4
原创 GNU ARM汇编--(十八)u-boot-采用nand_spl方式的启动方法
在《GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读》中分析完u-boot-2012.07的makefile以及mkconfig脚本后,发现一个现象:在makefile中少了许多xxx_config之类的目标,而在目录下多了一个boards.cfg文件.仔细看下makefile和mkconfig就明白其实也没什么实质性的变化.也就是说,我们在make xxx_
2012-11-26 21:09:07
14812
1
原创 linux下共享库的系统路径和查找
在使用qvfb做framebuffer模拟的时候,发现几个问题:第一个就是ubuntu的确不专业,没有很多库的支持,最好使用redhat,fedora之类的发行版本,这样会少很多编译之类的麻烦. 由于在ubuntu下编译qvfb缺少了很多库文件,而在没有网络的情况下,补齐这些库和头文件是非常麻烦的,所以准备在fedora中编译好后再放到ubuntu中使用.由于ubuntu和fed
2012-11-11 10:53:54
8951
原创 GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读
自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读! 阅读碰到的头等问题:Makefile和shell脚本看不懂... 说起来做linux也很久了,Makefile和shell脚本都接触过,但真的都是略懂而已.因为公司的Makefile和s
2012-10-31 21:43:08
18138
2
原创 linux驱动实践(一)--开篇
《GNU ARM汇编》系列写了不少,收获亦不小.依然还有很多可以继续往下写:一直想利用arm9的MMU写个小的os:包含简单设备模型,任务调度和内存管理的os,网络和文件系统就不要了.这个想法先放一下.另外对于uboot这样一个优秀的开源代码也想做个深入的分析,但考虑到自己的bootloader也能引导kernel,对bootloader也有了全面的理解,若今后需要搞uboot,看看uboot的代
2012-10-16 22:02:03
5594
原创 GNU ARM汇编--(十六)bootloader与kernel之间的commandline的传递
在《GNU ARM汇编--(十五)linux下的printascii》中已经初步分析了自己写的bootloader在引导kernel时候出现的commandline在bootloader和kernel之间传递的问题,今天终于解决了,并对参数传递有一些研究: 传递的参数为: params->u1.s.page_size = LINUX_PAGE_SIZE; params->u
2012-10-09 00:10:58
13332
4
原创 GNU ARM汇编--(十五)linux下的printascii
在前面对很多s3c2440的功能模块进行学习后,已经具备了将这些模块综合起来的条件,基于此,将前面的代码综合成一个简单的bootloader.自己写的bootloader在引导kernel的时候,串口输出只有Uncompressing Linux...和done, booting the kernel。串口有这个输出,说明kernel被正确引导了,但是串口有问题。 这篇blog只
2012-10-04 23:09:55
5902
1
原创 GNU ARM汇编--(十四)GNU ARM汇编下做任务调度
以前工作中用过arm7,没有MMU,也没有用任何OS.现在回忆当时的代码结构,我觉得可以叫无限循环的有限状态机.arm7不跑OS,就相当于单片机,单片机跑的肯定是无限死循环.有限状态机是因为整个代码要处理很多外部的事情,那就是大的循环里面来套小循环,以轮询的方式来检查外界的变化,然后系统作出变化,系统在有限的状态中切换. OS的一个标识就是支持多任务的并发.比方说linux,我们
2012-09-08 23:24:25
3164
6
原创 GNU ARM汇编--(十三)GNU ARM汇编下的linker script
在写GNU ARM汇编下的linker script之前,还是有必要看一下ldr指令,以及ldr和adr伪指令. ldr指令: LDR load word into a register Rd ldr伪指令: LDR Rd, =con
2012-08-26 23:27:13
3788
1
原创 GNU ARM汇编--(十二)arm汇编指令的B真的那么简单吗?
说句题外话,在输入“指令”二字的时候,就想起了google搜索时,提示“令”不能搜索,要我换词汇.如果不能说脏话,我真就无语了. 在前面对具体芯片的各个基本模块做完了学习后,在上一篇小结中自以为已经具备了自己写个bootloader的条件,但其实错了,我还有很多基本的知识不了解.比如编译链接\gnu的linker script等等.也有很多地方只懂表面,没有做深入的理解.
2012-08-23 23:15:15
7305
1
原创 linux下valgrind的使用概述
Valgrind简介: Valgrind是动态分析工具的框架。有很多Valgrind工具可以自动的检测许多内存管理和多进程/线程的bugs,在细节上剖析你的程序。你也可以利用Valgrind框架来实现自己的工具。 Valgrind通常包括6个工具:一个内存错误侦测工具,两个线程错误侦测工具,cache和分支预测的分析工具,堆的分析工具。 Val
2012-08-11 20:36:58
13005
原创 I2C之知(六)--s3c2440用I2C接口访问EEPROM
在前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来,最后还是放弃了.甚至参考了linux下i2c-algo-bit.c和i2c-gpio.c,依然没调出来.如果有示波器,可能很快就能找到原因,现在完全不知道问题出在哪里.其实想用GPI
2012-08-05 20:50:28
5444
原创 I2C之知(五)--I2C总线的10bit地址以及通用广播地址
其实,10bit地址我没用过,通用广播地址更没用过.通用广播地址应该是在多个mcu之间用i2c进行通信时使用的.虽说没用到,但还是做了翻译,说不定以后有机会用到:10bit地址10bit的寻址扩展可能寻址的数目.有7bit地址和10bit地址的设备可以连接到相同的I2C总线上,而且7bit寻址和10bit寻址都可以用在所有的总线速度模式下.不过,10bit寻址用的不多.10bit的从机
2012-08-05 17:27:27
21474
原创 I2C之知(四)--I2C总线的7bit从机地址
时钟拉伸(Clock stretching)clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.clock stretching是可选的,实际上大多数从设备不包括SCL驱动,所以它们不能stretch时钟.从字节级来看,一个设备可能在快速模式下接受数据,但是需要更多的时间来存储接收到的字节或者准备将要传输的另一个字节.从机可以以一种握
2012-07-19 00:17:34
31328
1
原创 I2C之知(三)--I2C总线的字节格式、时钟同步和仲裁
字节格式 发送到SDA线上的每个字节必须是8位.每次传输的字节数量是不受限制的.每个字节后必须跟着一个ACK应答位.数据从最高有效位(MSB)开始传输.如果从机要执行一些功能后才能接收或者发送新的完整数据,比如说服务一个内部中断,那么它可以将时钟线SCL拉低来强制使主机进入wait状态.当从机准备好新的字节数据传输时,释放时钟线SCL,数据传输便继续进行.
2012-07-17 23:06:33
11471
1
原创 I2C之知(二)--I2C总线SDA\SCL以及开始终止条件
I2C只用两条线(SDA和SCL)在连接到总线上的设备之间传送数据.每一个设备都由唯一的地址来识别(不管是微处理器、LCD驱动器、存储器或者键盘接口),并且可以依照设备的功能作为发送器或者接收器使用.LCD驱动器可能只是个接收器,而存储器可以发送和接受数据.除了发送器和接收器,当传送数据时设备还可以作为主机或者从机.主机就是初始化数据传输和产生时钟信号的设备,在那个时刻,任何被寻址的设备都是从机.
2012-07-16 22:51:42
31118
原创 I2C之知(一)--I2C的简介和特性
I2C我是想全面深入的从嵌入式软件工程师的角度做个理解,刚刚还申请了一个专栏,这个好好写. 学习技术从外文文档看起~~ 要全面了解I2C,可以从《I2C-bus specification and user manual》看起.I2C最初是由Philips提出的,那么这文档就是由NXP维护的. I2C总线被全球超过50个公司的1000+个I
2012-07-15 16:42:01
5374
原创 GNU ARM汇编--(十一)小结一下
对s3c2440的一部分做了学习,更深的了解了汇编以及arm体系,还有中断,调试底层汇编过程的最大感触就是仔细阅读datasheet,因为那是英文文档. 前面写的都是嵌入式底层比较基础的东西,后面要做的内容: 1.先裸机搞定iic,iic包括用控制器实现的和用GPIO模拟的,这样可以加深时序的理解. 2.spi也想看一下,虽然2440有spi,
2012-07-12 22:50:43
2966
原创 GNU ARM汇编--(十)s3c2440的RTC
RTC概述 在系统电源关掉时RTC可以在备份电池的支持下来工作.RTC可以使用STRB/LDRB指令传输8bit的BCD值到CPU.数据包括秒,分,时,日期,天,月和年.RTC工作在外部32.768KHz的晶振下,而且有报警功能.属性 BCD:秒,分,时,日期,天,月和年 闰年产生器 报警功能:报警中断 从power-off模式唤醒
2012-07-12 22:22:43
2995
1
原创 GNU ARM汇编--(九)s3c2440的PWM
依旧从datasheet开始看起,锻炼下阅读英文技术手册的能力PWM TIMER概述 s3c2440有5个16bit的定时器.Timer0,1,2和3有PWM功能.Timer4是没有输出管脚的内部定时器.Timer0有一个dead-zone产生器,用于大电流设备. Timer0和1共用一个8bit的预分频器,而timer2,3,4共用另外一个8bit的预分频器.每一个定
2012-06-30 21:08:46
3755
原创 GNU ARM汇编--(八)s3c2440的watchdog
从单片机起,watchdog就是必不可少的.在各种应用环境中,程序很可能跑飞或死掉,这时候就需要通过watchdog来保证整个系统重新恢复到正常状态. 照旧,给出s3c2440的datasheet说明:概述: watchdog timer用于由于噪声或者系统错误引起的程序跑飞了的情况下恢复处理器的正常操作.它可以被用作一个可以请求中断服务的普通16bit的内部定时器
2012-06-26 22:19:06
3110
原创 GNU ARM汇编--(七)s3c2440的串口控制
在配置完s3c2440的系统时钟后,我们来控制串口.之所以将串口放在这么靠前,是因为串口会给我们带来更多的信息.在没有串口的时候,uboot启动阶段只能靠led来显示一些信息.那么有了串口,debug就方便很多了.在工作中,一般情况下,很少有机会用jtag口加上昂贵的codeviser工具进行debug,也很少用gdb进行远程debug的,用的最多的还是打开debug的define来分析确定问题.
2012-06-24 13:02:00
5185
原创 GNU ARM汇编--(六)s3c2440的时钟控制
前面几篇利用GNU ARM汇编控制LED以及ARM的中断处理的设计,对ARM汇编以及体系结构有了一定的认识.后面的汇编学习会结合具体的芯片进行,一个为了更灵活熟练的使用汇编,二也是为了通过学习一款具体芯片来提炼出一些有价值的经验.此次选择的芯片是三星的s3c2440,arm920t的核,整个板子是TQ2440的板子,这个板子放了两年多了,零散的玩过一些,但是为了建立更有体系的知识结构,还是值得把它
2012-06-23 00:10:26
4865
原创 GNU ARM汇编--(五)中断汇编之嵌套中断处理
在上篇《GNU ARM汇编--(四)中断汇编之非嵌套中断处理》中分析了最简单的中断处理的写法,再看TQ2440启动代码中的中断向量表的写法就一目了然了.今天抽时间对嵌套中断处理的学习做下整理. 嵌套中断处理的核心代码如下:;/*; * _________________________________________________________________
2012-06-08 22:49:21
4834
原创 GNU ARM汇编--(四)中断汇编之非嵌套中断处理
在写这篇blog之前,不得不感慨一句:纸上得来终觉浅,绝知此事要躬行.作为EE出身的,虽然好久好久没用汇编写单片机的中断了,但自我感觉对中断的理解还是比较深入的,本以为在GNU ARM汇编下搞个中断会很容易,谁知道断断续续花了我几周.完全用汇编写中断和用c中的_irq写中断还是有区别的,谁用谁知道.还是那句话:深入细节是必须的,也是值得的. 这一篇blog的理论知识主要来源于:《
2012-06-03 11:06:41
6296
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人