
Embedded - C语言
tywali
长期从事嵌入式系统,呼叫中心,MIS的开发
展开
-
8031的历史回顾
因为工作需要,在10年之后,我又重操旧业,再度进入嵌入开发的领域,而所使用的CPU居然也跟10年前一样,还是8031,在这样一个迅速发展的领域里,8031真可以说得上是一个古董级的CPU了,不过虽然只是个8位的处理器,但是由于其电路简单,成本低廉,在很多对功能和性能要求不高的地方还是有用武之地的。 在十几年前(1995年),我刚刚毕业参加工作,进入一家通信企业(不是华为)做程控电话交换机,整个系统原创 2008-04-15 16:28:00 · 1150 阅读 · 0 评论 -
基于OHCI的USB主机 —— OHCI(基本流程)
根据上面的介绍可以发现,通过USB端口进行数据收发的主要工作就是构建ED和TD列表。其中ED列表控制数据的传输方向,TD列表完成具体的数据打包和传输。按照OHCI规范,ED和TD列表都是可以在使用过程中对某个节点进行修改,比如增加和删除。但是为了程序处理简便起见,最好采用顺序处理模式,也就是一个命令执行完毕以后,再重新构建新的ED和TD列表,执行下一个命令。进行控制/批量传输的主要处理流程原创 2009-12-07 18:02:00 · 1041 阅读 · 0 评论 -
基于OHCI的USB主机 —— OHCI(传输描述符)
传输描述符(TD) 传输描述符(TD)是系统内存的数据结构,被HC用于定义从端点收发数据的缓冲区。TD分为2个类型:通用TD和同步TD。通用TD用于中断、控制和批量端点,同步TD用于同步传输。使用两种不同的TD类型是因为缓冲区类型的不同。对于U盘主机控制器来说,不使用同步传输。原创 2009-12-07 10:38:00 · 1242 阅读 · 0 评论 -
基于OHCI的USB主机 —— OHCI(端点)
OHCI (Open Host Controller Interface),是康柏、微软、国家半导体等公司共同制定的一个USB主机接口规范,它提供一个更抽象的接口来完成USB数据传输工作。在OHCI规范中,最重要的几个概念是端点(EndPoint - ED)、传输描述符(Transport Descriptor -TD)、主机控制器通信区(HCCA)。其中ED负责确定传输类型(控制传输原创 2009-12-07 10:37:00 · 1417 阅读 · 0 评论 -
基于OHCI的USB主机 —— 寄存器(设备连接)
读取USB设备连接状态读取HcRhPortStatus寄存器可以得到相应USB端口是否有设备连接,但是在嵌入式系统中,为了增强系统的稳定性,要有适当的算法保证在一段时间内,连续读到设备连接或断开,则才能确定设备的连接状态,下面的函数在定时中断中被调用,用来检测USB设备的连接状况:/** * 读取USB原创 2009-12-07 10:34:00 · 811 阅读 · 0 评论 -
基于OHCI的USB主机 —— 寄存器(初始化)
硬件初始化的操作比较简单,主要代码从例程《AT91RM9200-BasicUHP》中抄过来,另外增加了中断向量初始化的部分。在AM9200中,USB的中断是基于AIC中断的,因此要设置对应的AIC中断。在此之前要设置OHCI的中断寄存器,代码如下:/** * USB主机初始化原创 2009-12-04 17:07:00 · 7809 阅读 · 0 评论 -
基于OHCI的USB主机 —— 寄存器(传输)
启动控制传输进行控制传输之前,需要设置好相应的ED和TD参数(参见下一章),启动传输时需要设置OHCI寄存器中的控制传输ED头指针寄存器和控制传输的当前ED指针寄存器,然后设置控制寄存器允许处理控制传输列表,控制状态寄存器有控制传输列表数据需要传输,代码如下:/** * 通过Control端口传原创 2009-12-04 17:09:00 · 849 阅读 · 0 评论 -
基于OHCI的USB主机 —— 寄存器层(说明)
AM9200支持标准的OHCI规范,在其开发文档中对于USB主机部分的说明干脆就直接说参见OHCI规范。阅读AM9200的例程《AT91RM9200-BasicUHP》代码,发现系统已经提供了访问OHCI寄存器的指针pUhp,使用该指针就可以访问到所有的OHCI寄存器,因此读写寄存器的操作就是对pUhp指针进行操作。按照面向对象的编程思想,将所有寄存器看作是一个对象,对其操作都是通过接口来原创 2009-12-04 17:02:00 · 1696 阅读 · 0 评论 -
基于OHCI的USB主机 —— OHCI(HCCA)
主机控制器通信区(HCCA)是一个256字节对齐的内存数据结构,被系统软件用于与HC进行通信,收发相关控制和状态信息。系统软件通过HcHCCA寄存器设置HCCA的地址到HC。该结构允许软件给HC的函数指明方向,而不需要从HC读取,除非不寻常的状况发生(例如发生错误)。通常与HC的交互可以通过读取HCCA结构的值或者写入原创 2009-12-07 10:38:00 · 1838 阅读 · 1 评论 -
基于OHCI的USB主机 —— 寄存器(其它)
USB端口关电对USB端口进行关电处理的目的主要有两个,一是安全拔下U盘,防止带电插拔造成数据丢失或错误,另一个是为了再次开电,对U盘内部程序进行复位。/** * 断开USB端口的供电 */short ohciHardDisable(void)原创 2009-12-07 10:35:00 · 981 阅读 · 0 评论 -
基于OHCI的USB主机 —— 寄存器(复位)
USB端口复位当USB设备连接到某个端口上以后,根据规范,需要对相应USB端口进行复位 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE原创 2009-12-07 10:32:00 · 790 阅读 · 0 评论 -
C-51的指针
最近做项目,使用C-51开发,为了提升性能使用了片内变量指针,定义如下:unsigned char data *pSor;该指针指向一个外部变量的地址,但是程序运行中发现对该指针进行操作,对应的外部变量的值并没有变化,检查汇编代码发现,该指针所占据的空间只有1个字节,没有办法访问外部变量,因此将该指针修改为外部变量,才正确的指向了对应的外部变量。总结如下:1、片内变量指针只能指向片内变量,但是与其原创 2008-04-18 17:56:00 · 538 阅读 · 0 评论 -
8031的串口故障
背景介绍: 系统中有两个模块需要使用串口进行通信,定时收发联络协议(2s一次),提供本模块的一些状态信息。模块的CPU使用8031,watchDog硬件设计为300ms内发送一个不少于50ms的高脉冲。 因为联络协议数据长度比较短(10字节左右),为编码简单,在发送时就没有采用状态迁移处理,而是同步的发送,也就是调用发送函数就会一直等到所有数据都发送完毕才会返回。故障现象: 代原创 2008-04-15 16:51:00 · 752 阅读 · 0 评论 -
C-51的数据存储区域与性能
C-51中数据存储有不同的区域,最常用的就是DATA和XDATA区,其中:DATA区位于RAM的低128字节,可在一个周期内直接寻址,不过需要注意系统的堆栈也使用这个区域,所以如果程序中如果有较多的中断处理程序,或者函数调用较多,则需要谨慎使用该区域的变量,以免变量和堆栈区域重合,程序运行时就会发生不可预料的后果,这种错误查找起来是非常麻烦的。XDATA就是片外RAM了,一般最大可达64K,使用D原创 2008-04-15 16:37:00 · 574 阅读 · 0 评论 -
C语言可变参数宏
岁月不饶人,这年纪大了记忆力真是差了很多。今天写程序需要用到可变参数的宏,可是忘了怎么写,这倒也没什么,因为我一向是不记忆这些语法细节的,反正我知道程序里有个地方用到了这种技巧,但是可悲的是我忘了在哪个地方。搜索?语法都忘了搜个P呀。只好凭着印象,在自己负责的模块代码中找了一圈,花了十几分钟才终于在日志模块找到。唉,看来还是写下来比较好,这记忆力实在是不能相信了。 C语言中,可变参数宏的写原创 2012-02-03 16:16:16 · 615 阅读 · 0 评论