摘要: C 语言嵌入式系统编程修炼之一:背景篇 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发的一般选择。而与之相比,C 语言:一种"高级的低级"语言,则成为嵌入式系统开发的最佳选择。 实际上,大多数嵌入式系统的硬件平台包括两部分:以通用处理器为中心的协议处理模块,用于网络控制协议的处理;以数字信号处理器(DSP)为中心的信号处理模块,用于调制、解调和数/模信号转换。嵌入式系统硬件架构协议处理模块中的 FLASH 和 RAM 几乎 阅读全文
posted @ 2013-07-03 20:48 Leo.cheng 阅读(1918) 评论(0) 推荐(3) 编辑
摘要: 一、为什么要使用库文件 我们在实际编程中肯定会遇到这种情况:有几个项目里有一些函数模块的功能相同,实现代码也相同,也是我们所说的重复代码。比如,很多项目里都有一个用户验证的功能。 代码段如下://UserLogin.h文件,提供函数声明int IsValidUser(char* username... 阅读全文
posted @ 2013-07-03 13:08 Leo.cheng 阅读(1024) 评论(0) 推荐(2) 编辑
摘要: 下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别。一、进程控制fork创建一个新进程clone按指定条件创建子进程execve运行可执行文件exit中止进程_exit立即中止当前进程getdtabl... 阅读全文
posted @ 2013-07-01 17:04 Leo.cheng 阅读(859) 评论(0) 推荐(1) 编辑
摘要: 库的定义 库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成,从本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 无论在Windows 平台还是Linux平台下都存在大量的库,但由于Windows... 阅读全文
posted @ 2013-06-30 15:30 Leo.cheng 阅读(1049) 评论(0) 推荐(0) 编辑
摘要: 一、预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)ULView Code 想看到的几件事情:#define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。意识到这个表达式将使一个 16 位机的整型数溢出-因此要用到长整型符号 L,告诉编译器这个常数是的长整型数。如果你在你的表达式中用到 UL.. 阅读全文
posted @ 2013-06-30 09:08 Leo.cheng 阅读(1375) 评论(1) 推荐(1) 编辑
摘要: 本文为笔者阅读《嵌入式C精华》的摘录,推荐一下,不错的书一、C/C++语言 struct深层探索1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int、long、float等)的变量,也可以是一些复合数据类型(如 array、stuct、union等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。 缺少情况下,编译器为结构体的每个成员按其自然对界(natural alignment:即默认对齐方式,是指按结构体成员中 size最大的成员对齐)条件分配空间。各个成员按照它们被声明的顺序在内存中的顺序存储,第一个成员的地址和整个结构的.. 阅读全文
posted @ 2013-06-29 18:07 Leo.cheng 阅读(2400) 评论(3) 推荐(1) 编辑
摘要: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。其解决办法和我以前发过的【算法之美—Fire Net:www.cnblogs.com/lcw/p/3159414.html】类似题目:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问... 阅读全文
posted @ 2013-06-29 15:54 Leo.cheng 阅读(555) 评论(0) 推荐(0) 编辑
摘要: 题目概述:Jugs In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with the following puzzle. They were given a 3-gallon jug and... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(648) 评论(0) 推荐(0) 编辑
摘要: 基本电路原理——》电压和水压一样,水坝筑得越高水压越高,电流和水流一样,只要在一条渠道上假设渠道宽度深度一致,在渠道各处水流量是一致的,这就是串联电路中电流处处相等的道理。——》如果两条同样的渠道共同向一处供水水量会加倍,即并联电路的汇合处电流是两条(或多条)电路电流之和,这就是基尔霍夫电流节点定律... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(627) 评论(0) 推荐(0) 编辑
摘要: Flash存储器——》Flash存储器是近几年来发展最快的存储设备,通常也称作闪存。Flash属于EEPROM(电可擦除可编程只读存储器),是一类存取速度很高的存储器。——》它既有ROM断电可保存数据的特点,又有易于擦写的特点。Flash可以在断电的情况下长期保存信息,因此被广泛的应用在PC机的BIOS和嵌入式系统的存储设备。Linux Flash驱动结构——》Linux内核对Flash存储器有很好的支持。内核设计了一个MTD结构支持Flash设备,用户只需要按照MTD的要求设置Flash设备的参数并且提供驱动就可以让Flash设备很好的工作。MTD概述——》MTD是英文Memory Tech 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(929) 评论(0) 推荐(0) 编辑
摘要: 触摸屏概述——》触摸屏并不是人们日常所见的立方体屏幕,它只是覆盖在显示屏表面的一层薄片,其工作原理比较简单,当有触摸笔或其他物体接触到触摸屏时,系统会根据触摸笔点击的图标或按键来接收信息,并作出一些人为设计的响应动作,从而实现人机交互功能。它的主要目的提供方便的人机交互功能,降低智能设备的操作难度,... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(1070) 评论(0) 推荐(0) 编辑
摘要: LCD显示器概述——》液晶显示器,LCD为英文 Liquid Crystal Display的缩写,它是一种数字显示技术,可以通过液晶和彩色过滤光源,并在平面面板上产生图像。——》与传统的阴极射线管(CRT)相比,LCD占用空间小、低功耗、低辐射、无闪烁、降低视觉疲劳,具有很大的发展潜力。液晶——》... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(2527) 评论(0) 推荐(0) 编辑
摘要: Preface USB体系支持多种类型的设备。 在 Linux内核,所有的USB设备都使用 usb_driver结构描述。 对于不同类型的 USB设备,内核使用传统的设备驱动模型建立设备驱动描述,然后映射到 USB设备驱动,最终完成特定类型的 USB设备驱动 USB驱动·入门:http://infohacker.blog.51cto.com/6751239/1226257USB串口驱动 USB串口驱动关键是向内核注册串口设备结构,并且设置串口的操作。 下面是一个典型的USB设备驱动分析。1、驱动初始化函数 usb_serial_init()函数是一个典型的 USB设备驱动初始化函.. 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(1271) 评论(0) 推荐(0) 编辑
摘要: Preface USB是目前最流行的系统总线之一。随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导致计算机外部总线种类繁多,管理困难。USB总线正是因此而诞生的。USB总线提供了所有外部设备的统一连接方式,并且支持热插拔,方便了厂商开发设备和用户使用设备。USB遵循原则 USB的设计目标是对现有的PC机体系进行扩充,但是目前不仅是PC机,许多的嵌入式系统都开始支持USB总线和接口标准。USB设计主要遵循下面几个原则:易于扩充外部设备:USB支持一个接口最多127个设备。灵活的传输协议: 支持同步和异步数据传输。设备兼容性好: 可以兼容不同类型的设备。接口标准统一:不同的设备之间使用 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(1632) 评论(0) 推荐(1) 编辑
摘要: 开发环境 1、硬件平台:FS2410 2、主机:Ubuntu 12.04ADC寄存器配置 1、初始化ADC(ADCCON) 设置预分频,预分频因子,选择A/D转换通道,并选择正常模式且启动转换 2、判断转换是否结束(ADCCON[5]) 3、读取转换结果(ADCDATn)串口的初始化 见《串口通信·FS2410》:http://infohacker.blog.51cto.com/6751239/1223137源代码 //adc.c#include "2410addr.h" //头文件,包含寄存器的设置 ... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(717) 评论(0) 推荐(0) 编辑
摘要: 1.安装tftpd(tftp服务器)、tftp(tftp客户端)以及xinetd(超级服务器)1.安装tftpd(tftp服务器)、tftp(tftp客户端)以及xinetd(超级服务器)1.安装tftpd(tftp服务器)、tftp(tftp客户端)以及xinetd(超级服务器)1.安装tftpd... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(520) 评论(0) 推荐(0) 编辑
摘要: 移植环境 硬件平台:FS2410 U-Boot版本:u-boot-1.1.6 编译器:arm-linux-gcc version 3.4.1U-Boot主要目录结构 U-Boot的 stage1代码通常放在 cpu/……/start.S文件中,它用汇编语言写成; U-Boot的 stage... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(743) 评论(0) 推荐(0) 编辑
摘要: 开发环境 (1)硬件平台:FS2410 (2)主机:Ubuntu 12.04FS2410串口的原理图串口UART寄存器配置配置TXD0与RXD0(GPH2、GPH3)设置波特率(UBRDIVn)设置传输格式(ULCONn)选择时钟源与中断方式(UCONn)设置FIFO(UFCONn)设置流控(UMCONn)接收字符和发送字符(UTRSTATn)源代码 //uart.c#include "2410addr.h" void putc(char ch) ... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(768) 评论(0) 推荐(0) 编辑
摘要: 开发环境 硬件平台:FS2410 主机:Ubuntu 12.04 LTSLED灯原理图按键原理图按键的接线资源KSCAN0 -> GPE11 KSCAN1 -> GPG6 KSCAN2 -> GPE13 KSCAN3 -> GPG2 EINT0 -> GPF0 EINT2 -> GPF2 EINT11 -> GPG3 EINT19 -> GPG11程序主要原理这里实现对 K1,K2,K3,K4 这四个键的查询。 主要涉及到K1,K2, K3, K4这四个按键,要用查询的方式进行判断哪个键被按下去了,因此:将EINT11, EINT19设置为输入, 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(559) 评论(0) 推荐(0) 编辑
摘要: Preface 内核源码版本:linux-2.6.18 网卡驱动·linux内核网络分层结构:http://infohacker.blog.51cto.com/6751239/1221140DM9000芯片 DM9000是一款高度集成低功耗快速以太网处理器,该芯片集成了MAC和PHY。DM9000可以和CPU直接连接,支持8位、16位和32位数据总线宽度。该芯片支持10M和100M自适应以太网接口,内部有16K的FIFO以及4K双字节SRAM,支持全双工工作。 DM9000内部还集成了接收缓冲区,可以在接收到数据的时候把数据存放到缓冲区中,链路层可以直接把数据从缓冲区取走。网卡驱动程 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(3481) 评论(2) 推荐(1) 编辑
摘要: Preface Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计。 Linux内核采用分层结构处理网络数据包。分层结构与网络协议的结构匹配,既能简化数据包处理流程,又便于扩展和维护。内核网络结构 在Linux内核中,对网络部分按照网络协议层、网络设备层、设备驱动功能层和网络媒介层的分层体系设计。 网络驱动功能层主要通过网络驱动程序实现。 在Linux内核,所有的网络设备都被抽象为一个接口处理,该接口提供了所有的网络操作。 net_device结构表示网络设备在内核中的情况,也就是网络设备接口。网络设备接口既包括软件虚拟的网络设备接口,如环路设备,也... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(748) 评论(0) 推荐(0) 编辑
摘要: 开发环境1、硬件平台:FS2410(s3c2410)2、主机:Ubuntu 12.04 LTSLED原理图LED的GPIO的配置配置GPFCON寄存器,设置GPF4-7为输出配置GPFDAT,设置LED灯亮与灭主要步骤通过设置GPFCON将GPF4-7设置为输出设置GPFDAT,可以将led灯亮或灭,GPFDAT的相应位置1灯灭,置0灯亮源代码 NAND flash启动关狗 设置栈//start.S.text.global _start_start:#define WATCHDOG 0x53000000 ldr r0, =WATCHDOG //关看门狗 mov r1, #0 ... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(610) 评论(0) 推荐(0) 编辑
摘要: InstallShield Installshield是一个强大和易于使用,用于解决Windows软件安装包开发的制作工具。用它可以以传统MSI方式和虚拟格式,自动化地封装、捆绑和包装你的产品。 IntallShield能使你的用户在决定何时何地何方式管理和部署你的应用程序时,得到一个最时尚舒畅的... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(3448) 评论(1) 推荐(0) 编辑
摘要: Preface 虽然以前在windows上远控linux都是用的FTP+CRT,不过有些时候还是不太方便,比如不能用IDE对程序进行调试,现在就来配置下VNC,过程中出了些错误,上网查询时发现很多解决方法都没用,所以留下笔记,方便以后查阅! Virtual Network Computing(VN... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(1014) 评论(0) 推荐(0) 编辑
摘要: Preface 前面对linux设备驱动的相应知识点进行了总结,现在进入实践阶段! 《linux设备驱动入门篇》:http://infohacker.blog.51cto.com/6751239/1218461 《linux设备驱动扫盲篇》:http://infohacker.blog.51cto.com/6751239/1218747 《fedora下的字符设备驱动开发》:http://infohacker.blog.51cto.com/6751239/1155153开发一个基本的字符设备驱动 在Linux内核驱动中,字符设备是最基本的设备驱动。字符设备包括了设备最基本的操作,如打... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(547) 评论(0) 推荐(0) 编辑
摘要: linux设备驱动 Linux系统把设备驱动分成字符设备、块设备和网络设备三种类型。内核为设备驱动提供了注册和管理的接口,设备驱动还可以使用内核提供的其他功能以及访问内核资源。PCI局部总线 早期的计算机有众多总线标准。从最初的8位总线到16位总线,到目前主流的32位总线,不同厂商都制定了自己的总线标准。不同的总线设备给设备驱动的设计带了麻烦,直到后来PCI局部总线出台这种局面才得到缓解,并且逐步成为事实上的标准。 PCI是英文Peripheral Component Interconnect的缩写,中文意思是外设部件互连标准。 PCI局部总线标准最早由英特尔公司为制定,最初主要应用在P... 阅读全文
posted @ 2013-06-27 17:40 Leo.cheng 阅读(1251) 评论(0) 推荐(0) 编辑
摘要: linux设备驱动 驱动程序英文全称Device Driver,也称作设备驱动程序。驱动程序是用于计算机和外部设备通信的特殊程序,相当于软件和硬件的接口,通常只有操作系统能使用驱动程序。 在现代计算机体系结构中,操作系统并不直接于硬件打交道,而是通过驱动程序于硬件通信。设备驱动介绍 驱动程序是附加到操作系统的一段程序,通常用于硬件通信。 每种硬件都有自己的驱动程序,其中包含了硬件设备的信息。操作系统通过驱动程序提供的硬件信息与硬件设备通信。由于驱动设备的重要性,在安装操作系统后需要安装驱动程序,外部设备才能正常工作。 Linux内核自带了相当多的设备驱动程序,几乎可以驱动目前主流的各种硬... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(2941) 评论(0) 推荐(2) 编辑
摘要: 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。❶先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; // global variablevoid msg(){ printf("Hello\n");}下面是main.c的内容int main(void){ extern char a; // extern variable 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(414) 评论(0) 推荐(1) 编辑
摘要: BusyBox 是很多标准 Linux® 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet(不过它的选项比传统的版本要少);有些人将 BusyBox 称为 Linux ... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(17479) 评论(0) 推荐(1) 编辑
摘要: Preface 话说,在用暴风影音进行视频播放的时候,利用其它的软件对视频进行截图的时候,并不能截取到视频的画面,我这里用QQ五笔的截图功能截图,效果如下 对于这种情况,以前也经常遇上,但是也没有想过为什么? 可以看见,黑屏的只是视频播放界面,而播放列表与边框都可以显示! 然后我就在群里问了... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(1507) 评论(0) 推荐(0) 编辑
摘要: Preface 当用户编译一个linux内核代码后,会产生几个文件:vmlinz、initrd.img, 以及System.map,如果配置过grub引导管理器程序,会在/boot目录下看到这几个文件。vmlinuz vmlinuz是可引导的、压缩的内核文件。 该文件包含了一个最小功能的内核,... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(4218) 评论(0) 推荐(0) 编辑
摘要: Perface 前面已经写过一篇《嵌入式linux内核的五个子系统》,概括性比较强,也比较简略,现在对其进行补充说明。 仅留此笔记,待日后查看及补充!Linux内核的子系统 内核是操作系统的核心。Linux内核提供很多基本功能,如虚拟内存、多任务、共享库、需求加载、共享写时拷贝(Copy-On... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(1828) 评论(0) 推荐(0) 编辑
摘要: 目录 Linux2.6版本内核编译配置选项(一):http://infohacker.blog.51cto.com/6751239/1203633 Linux2.6版本内核编译配置选项(二):http://infohacker.blog.51cto.com/6751239/1203635Device... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(2099) 评论(0) 推荐(0) 编辑
摘要: Linux 2.6.19.x 内核编译配置选项简介作者:金步国版权声明本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(983) 评论(0) 推荐(0) 编辑
摘要: Preface 之前也发表过关于《Bootloader启动过程分析》的文章,但是内容表达得比较抽象,大多是文字叙述,所以这里从系统和代码的角度来深入分析bootloader的启动过程。 工具:Source Insight 目标:U-Boot-1.1.6 仅留此分析过程,日后再作补充(纯手打也不容易啊... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(1126) 评论(0) 推荐(0) 编辑
摘要: 加载.s汇编文件 做ARM嵌入式开发时,有时得整汇编代码,但在SI里建立PROJECT并ADD TREE的时候,根据默认设置并不会把该TREE里面所有汇编文件都包含进来,默认只加了.inc和.asm后缀的,.s后缀的没有。而且用SI打开.s的文件时,一片黑白没有色彩, 感觉回到DOS的EDIT时代... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(2064) 评论(0) 推荐(0) 编辑
摘要: 什么是Initrd initrd的英文含义是 boot loader initialized RAM disk,就是由boot loader初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(2909) 评论(0) 推荐(0) 编辑
摘要: Perface Linux内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)5个子系统组成,如图1所示。图1 Linux内核的组成部分与关系1.进程调度 进程调度控制系统中的多个进程对CPU的访问,使得多个进程能在CPU中“微观串... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(790) 评论(0) 推荐(0) 编辑
摘要: 内存管理介绍 早期的计算机内存容量非常小,当时的PC主要使用DOS操作系统或者其它操作系统。早期的操作系统由于系统硬件的限制,无法支持内存管理,应用程序占用的空间和程序规模都比较小。随着计算机硬件性能不断提高,程序的处理能力也不断提高,应用程序占用的存储空间不断膨胀。实际上,程序的膨胀速度远远超过... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(443) 评论(0) 推荐(0) 编辑
摘要: Perface 随着技术的进步,小作坊式的软件开发年代已经过去。目前的软件开发能力在不断提升,用户对软件的功能和性能要求也越来越高,软件开发质量受到关注。 在软件开发过程中,各种数据和代码的管理需要经过统筹安排和管理,出现了各种软件开发文档,用于控制软件开发过程。软件开发文档是与开发阶段对应的。 一般来说,每个阶段至少产生一种文档。软件开发文档描述了在软件开发各阶段中不同的任务。不同组织和公司有不同的开发文档和规范,使用不同的开发模型产生的文档内容也不相同。软件开发文档指导不同阶段的相关人员的工作,不同阶段的设计人员会设计出相应阶段的最终文档。如需求设计文档指导项目经理做软件的框架设计,... 阅读全文
posted @ 2013-06-27 17:39 Leo.cheng 阅读(746) 评论(0) 推荐(0) 编辑