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; 来表示当前灯光的实际状态,在每次点亮或者熄灭操作之前,将buf的数据保存到led_status中,但是如果led_status[]数组被其他程序“意外”访问而修改,在执行led_read( char * buf, int count )函数的时候,就会得到一个错误的灯光状态,进而后面的点灯和灭灯都出现错误。有什么手段能避免从一个不完全真实的内存变量(这里指led_status[]数组)中获得当前灯状态呢?能不能通过IO口实际读到灯光状态?
将setp-by-step-9中的一些程序改成用C++实现
欢迎测试 请注意, static char led_status;是一个 static 定义的内部变量,除了通过驱动的接口 led_read, led_write 是无法访问到这个变量的,所以不存在其他程序“意外”访问而修改的情况,这有些类似于 C++ 里面的private 数据和 public 方法。 :wink:你用 C++ 改写的例子非常棒,值得我们大家学习和借鉴! 我还没有尝试过用 c++ 写 ARM 的程序,但我觉得这个方向的探索是非常有意思的。
我的想法是,LED 这个 class 是要分为 2 个层次,一个硬件无关的接口层就是 Led_API_Class , 另一个与硬件相关的就是 Led_DRV_Class ,其中前一个 class 里面要包含后一个 class 的实例,或者可以把所有 xxx_DRV_Class 都抽象出一个基类或者是抽象类,所有驱动接口都必须遵循相同的接口标准。这样未来在其他平台上的移植工作就非常清晰和模块化了。8) 谢谢斑竹。我需要再理解理解。
“前一个 class 里面要包含后一个 class 的实例”,是指:“在xxx_API_Class的定义中用xxx_DRV_Class定义出一个对象(实例),作为xxx_API_Class的成员变量”吗? 将xxx_DRV_Class写为抽象类,形成接口标准,具体的设备驱动都必须继承这个抽象类,这样程序使用和阅读都比较规范了。 差不多是这个意思,举个例子来说吧,
Led_API_Class 有一个成员变量是 Led_DRV_Classdriver ;
还有一个接口是 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 就可以了。
页:
1
[2]