QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: jtag

我是初学者,Lumit一定会推动我学习进步

[复制链接]
 楼主| 发表于 2005-9-1 21:23:12 | 显示全部楼层
在step-by-setp-9中,有许多优秀的C代码的编写方式和风格都是我从来没有见过的,其中将一个数值value按位转换到一个数组中:
        for( i = 0; i < count; i++ )
                buf = led_status;       
反之将一个boolean型数组转换为一个数值value,也是很好用的:
        for( i = 0; i < LED_NUM; i++ )
                value = value | (buf << i);
请教:用一个静态数组 static char led_status[LED_NUM]; 来表示当前灯光的实际状态,在每次点亮或者熄灭操作之前,将buf的数据保存到led_status中,但是如果led_status[]数组被其他程序“意外”访问而修改,在执行led_read( char * buf, int count )函数的时候,就会得到一个错误的灯光状态,进而后面的点灯和灭灯都出现错误。有什么手段能避免从一个不完全真实的内存变量(这里指led_status[]数组)中获得当前灯状态呢?能不能通过IO口实际读到灯光状态?
回复

使用道具 举报

 楼主| 发表于 2005-9-1 22:47:20 | 显示全部楼层

将setp-by-step-9中的一些程序改成用C++实现

欢迎测试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2005-9-2 00:54:35 | 显示全部楼层
请注意, static char led_status[LED_NUM];  是一个 static 定义的内部变量,除了通过驱动的接口 led_read, led_write 是无法访问到这个变量的,所以不存在其他程序“意外”访问而修改的情况,这有些类似于 C++ 里面的  private 数据和 public 方法。

你用 C++ 改写的例子非常棒,值得我们大家学习和借鉴! 我还没有尝试过用 c++ 写 ARM 的程序,但我觉得这个方向的探索是非常有意思的。

我的想法是,LED 这个 class 是要分为 2 个层次,一个硬件无关的接口层就是 Led_API_Class , 另一个与硬件相关的就是 Led_DRV_Class ,其中前一个 class 里面要包含后一个 class 的实例,或者可以把所有 xxx_DRV_Class 都抽象出一个基类或者是抽象类,所有驱动接口都必须遵循相同的接口标准。这样未来在其他平台上的移植工作就非常清晰和模块化了。  
回复

使用道具 举报

 楼主| 发表于 2005-9-2 14:31:41 | 显示全部楼层
谢谢斑竹。我需要再理解理解。
“前一个 class 里面要包含后一个 class 的实例”,是指:“在xxx_API_Class的定义中用xxx_DRV_Class定义出一个对象(实例),作为xxx_API_Class的成员变量”吗? 将xxx_DRV_Class写为抽象类,形成接口标准,具体的设备驱动都必须继承这个抽象类,这样程序使用和阅读都比较规范了。
回复

使用道具 举报

发表于 2005-9-2 15:00:07 | 显示全部楼层
差不多是这个意思,举个例子来说吧,
Led_API_Class 有一个成员变量是 Led_DRV_Class  driver ;
还有一个接口是 Scroll() ; 功能是依次显示 led1 到 led7,即类似跑马灯效果。

这个接口它调用的是 driver 的 write 接口,也就是 for i=1 to 7    driver.write (i);

那么以后我将这个程序移植到其他开发板上的时候,只需要修改 Led_DRV_Class 的实现,而不需要改动 Led_DRV_Class ; 甚至可以用 Beep_DRV_class 来定义 driver ,这样 跑马灯的效果就变成了发出 Do Re Mi Fa So La Xi 的声音了,同样的,我们也可以把一首歌曲的音乐变成各种输出设备的输出,包括 led、seg7 或者 lcd ,只要添加相应的 driver 就可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-22 21:29 , Processed in 0.078990 second(s), 13 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表