阿里山's profile阿里山的共享空间PhotosBlogListsMore ![]() | Help |
|
|
阿里山的共享空间October 25 周末 周六参加了浦东联营小学的支教活动。联营小学民工子弟学校,招收的都是来沪打工的学生。学制从一年到六年级。学生六年级时从老家转学过来的,也有从一年级就开始在这上学的。课程除了数学语文,也有英语、音乐、美术,但教师办公室逛了一圈,也没看到一台乐器。图书室很小,书也很少。教室看上去很像板房,走进去原来来是砖木结构。教室内部有电插座,也有风扇对付上海夏天湿热的天气。从教室的布置可以看出老师的安排是很随意的,黑板报写了一半,墙上的花纸也是好像也是学生自己贴上去,不太整齐。桌椅的综合板边都磨出毛边,腿也锈迹斑斑。操场比较小,只放了一个篮球板,孩子们争相投篮。孩子的父母是无奈的,对孩子们成长的环境很难有所为,但孩子好像是适应了这种环境,给什么样的条件他们就能怎么样的成长。希望我们的可为人士和部门能替这些孩子们多安排些未来的路。 November 10 下周大盘走势 经过这周的震荡,大盘仍然不明朗。1、股市的价值是用流动资金表现的,最近没有新的资金加入,如新基金的发布,中国石油套住了不少资金;石油审购退回资金还没有动,大家明却想建仓权重股,而权重股还没跌破60日线,所以仍然在观望。海外流动资金因为周遍股市的暴跌,恒指和港指都创单周新底,不可能也对国内市场的兴趣太大,即使有也是小批量。2、技术层面,1月24日2994点调整,在3月5日结束于2723点,最低点2541,跌幅18%,最后止与30日均线。第二次调整,5·30",始于4335点,结束于7月5日的3614点,最低见到3404点,跌幅27.35%,两次探底60日均线。第三次中级调整,始于10月16日的6124点,至今仍然没有见到结束的迹象。3、市场参面,一、二次调整,蓝筹权重股的涨幅很小,又逢2007年中报公布之际,新会计制度的全面实施,人们发现众多蓝筹权重股的业绩增幅相当惊人,明显低估了权重股,因终止了调整。在经过三个月的上涨,指数涨幅近70%之后,蓝筹权重股的市盈率已近60倍,又逢第三季报公布之际。而第三季报显示出,以蓝筹权重股为主的上市公司,其业绩增速出现下降迹象,非权重股也跌跌不休,自然调整也就在所难免。4、人为因素,机构是追求利益最大化,不会轻易放弃对权重股打压探底。5、市场由人操作,不许有幻想和懦弱,下周有雨,收网整修。 October 01 UARTUART: Universival Asychronous Receiver/Transmitter 通用接收/发送异步传输 UART是一种较为通用的数据传输的方法(即Start Bit+Data+Check+StopBit),而COM口中Rx、Tx的数据格式即为UART。 RS232是UART的一种.计算机中的COM1和COM2都是RS232串行通信标准接口。当Uart接口连到PC机上时,需要接RS232电平转换电路。 什么是串行异步总线任何一个微处理器都要与一定数量的部件和外围设备连接,但如果将各部件和每一种外围设备都分别用一组线路与CPU直接连接,那么连线将会错综复杂,甚至难以实现。为了简化硬件电路设计、简化系统结构,常用一组线路,配置以适当的接口电路,与各部件和外围设备连接,这组共用的连接线路被称为总线。采用总线结构便于部件和设备的扩充,尤其制定了统一的总线标准则容易使不同设备间实现互连。 ----微机中总线一般有内部总线、系统总线和外部总线。内部总线是微机内部各外围芯片与处理器之间的总线,用于芯片一级的互连;而系统总线是微机中各插件板与系统板之间的总线,用于插件板一级的互连;外部总线则是微机和外部设备之间的总线,微机作为一种设备,通过该总线和其他设备进行信息与数据交换,它用于设备一级的互连。 ----另外,从广义上说,计算机通信方式可以分为并行通信和串行通信,相应的通信总线被称为并行总线和串行总线。并行通信速度快、实时性好,但由于占用的口线多,不适于小型化产品;而串行通信速率虽低,但在数据通信吞吐量不是很大的微处理电路中则显得更加简易、方便、灵活。串行通信一般可分为异步模式和同步模式。 ----随着微电子技术和计算机技术的发展,总线技术也在不断地发展和完善,而使计算机总线技术种类繁多,各具特色。下面仅对微机各类总线中目前比较流行的总线技术分别加以介绍。 一、内部总线 ----1.I2C总线 ----I2C(Inter-IC)总线10多年前由Philips公司推出,是近年来在微电子通信控制领域广泛采用的一种新型总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点。在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,IC2总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件(如图3):当SCL保持“高”,SDA由“高”变为“低”时为开始条件;SCL保持“高”,SDA由“低”变为“高”是为停止条件。开始和停止条件由主控器产生。使用硬件接口可以很容易地检测开始和停止条件,没有这种接口的微机必须以每时钟周期至少两次对SDA取样以使检测这种变化。 ---- SDA线上的数据在时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。输出到SDA线上的每个字节必须是8位,每次传输的字节不受限制,每个字节必须有一个应答为ACK。如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线SCL为低,以促使发送器进入等待状态,当接收器械准备好接受数据的其它字节并释放时钟SCL后,数据传输继续进行。 ---- 数据传送具有应答是必须的。与应答对应的时钟脉冲由主控器产生,发送器在应答期间必须下拉SDA线。当寻址的被控器件不能应答时,数据保持为高,接着主控器产生停止条件终止传输。在传输的过程中,当用到主控接收器的情况下,主控接收器必须发出一数据结束信号给被控发送器,被控发送器必须释放数据线,以允许主控器产生停止条件。合法的数据传输格式如下:
---- I2C总线在开始条件后的首字节决定哪个被控器将被主控器选择,例外的是“通用访问”地址,它可以寻址所有期间。当主控器输出一地址时,系统中的每一器件都将开始条件后的前七位地址和自己地址比较。如果相同,该器件认为自己被主控器寻址,而作为被控接收器或被控发送器则取决于R/W位。 ---- 二、I2C总线的应用 ---- I2C总线是各种总线中使用信号线最少,并具有自动寻址,多主机时钟同步和仲裁等功能很强的总线。因此,使用I2C设计计算机系统十分方便、灵活、体积也小,在各类实际应用中得到广泛应用。下面举两个应用示例。 ----1. 伺服控制系统用I2C扩展LCD显示 ---- 图5是一个伺服系统的结构图。用8XC752单片机的PWM输出经放大后驱动电机,电机的转速有测速机测取并直接送到8XC752片内A/D电路。处理后的有关信息经I2C总线送到LCD驱动芯片PCF8577以驱动六十四段LCD显示板 ----2. 通用I/O端口作为I2C总线接口 ---- 目前,51、96系列的单片机应用很广,但是它们都没有I2C总线接口,限制了在这些系统中使用具有I2C总线接口的器件。但通过对I2C总线时序的分析知道可以用51单片机的两根I/O线来实现I2C总线的功能。I2C总线规定SCL线和SDA线是各设备对应输出状态相“与”的结果,任一设备都可以用输出低电平的方法延长SCL低电平时间,迫使高速设备进入等待状态,实现不同速度设备间的时钟同步。因此,即使时钟脉冲的高、低电平时间长短不一,也能实现数据的可靠传送,可以用软件控制I/O口做I2C接口。下面就是用GMS97C2051DE的通用I/O口作为I2C总线接口由软件控制实现数据传送的例子,图6为其连线图。 September 23 typedef定义己以前对typedef的应用只是停留在最简单的例子上面,最近两天在看QualNet协议源代码时出现了好多的typedef才发现对它的理解真是皮毛,在网上搜了下,专门查了下谭老师的C语言课本。收获列在下面:很多东西不是自己的呵呵) Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法? 1、使用 typedefs 为现有类型创建同义字,定义易于记忆的类型名 。 typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef'' 关键字右边。例如: typedef int size; 此声明定义了一个 int 的同义字,名字为 size。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 size: void measure(size * psz); size array[4]; size len = file.getlength(); std::vector vs; typedef 还可以掩饰符合类型,如指针和数组。例如,你不用象下面这样重复定义有 81 个字符元素的数组: char line[81]; char text[81]; 定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样: typedef char Line[81]; Line text, secondline; getline(text); 同样,可以象下面这样隐藏指针语法: typedef char * pstr; int mystrcmp(pstr, pstr); 这里将带我们到达 typedef 陷阱。标准函数 strcmp()有两个‘const char *'类型的参数。因此,它可能会误导人们象下面这样声明 mystrcmp(): int mystrcmp(const pstr, const pstr); 这是错误的,按照顺序,‘const pstr'被解释为‘char * const'(一个指向 char 的常量指针),而不是‘const char *'(指向常量 char 的指针)。这个问题很容易解决: typedef const char * cpstr; int mystrcmp(cpstr, cpstr); // 现在是正确的 记住:不管什么时候,只要为指针声明 typedef,那么都要在最终的 typedef 名称中加一个 const,以使得该指针本身是常量,而不是对象。 2、代码简化 上面讨论的 typedef 行为有点像 #define 宏,用其实际类型替代同义字。不同点是 typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。例如: typedef int (*PF) (const char *, const char *); 这个声明引入了 PF 类型作为函数指针的同义字,该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。如果要使用下列形式的函数声明,那么上述这个 typedef 是不可或缺的: PF Register(PF pf); Register() 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef,我们是如何实现这个声明的: int (*Register (int (*pf)(const char *, const char *))) (const char *, const char *); 很少有程序员理解它是什么意思,更不用说这种费解的代码所带来的出错风险了。显然,这里使用 typedef 不是一种特权,而是一种必需。持怀疑态度的人可能会问:"OK,有人还会写这样的代码吗?",快速浏览一下揭示 signal()函数的头文件 ,一个有同样接口的函数。 最后介绍下,谭老师的方法: typedef char Line[81]; Line text, secondline; 怎么看呢?(1)char text[81];(2)用新名称代替变量名(Line代替text)char Line[81];(3)在前面加typedef:typedef char Line[81]; 得到。当看代码时逆序即可。 最让人头疼的是回调函数的typedef定义了,太复杂了。 就是上面倾斜的那样。 |
|
|||||||||||
|
|