IAR写的C++程序,不知道构造函数如何让位变量指向端口?
/************************************初学C++,这是个测试程序,设计的想法是,把最普遍的IO口,作一个对象来看待。
指定一个端口,构造一个端口对象
*************************************/
#include<ioat89c51.h>
class Led{
private:
bool LED_IO;//位变量,但如何指向构造函数的参数。
public:
Led(bool b){//此处怎样写,让LED_IO 指向b(即P3_bit.P3_0)
}
void on(){
LED_IO=1;
}
void off(){
LED_IO=0;
}
};
void delayms(int ms){
while(ms--)
for(int i=0;i<1000;i++);
}
int main(){
Led led1(P3_bit.P3_0);
while(1){
led1.on();
delayms(100);
led1.off();
delayms(100);
}
}
这样写,不是为了标新立异,是想从这里开始把MCU所有内部资源作为对象的方式编程。但构造函数不知道如何写,才能把LED_IO与P3.0等同起来。对LED_IO的操作可以影响P3.0. 51的sfr都是直接寻址,想直接传个sfr的指针是不行的, 要想写个通用的"类", 你只能传仿函数或函数指针进去,建议你先G搜索一下仿函数和函数指针,自己试着写一下先。
另外,面向对象需要谨慎,这玩意很容易导致过度设计,而忽略数据结构和算法,我个人除了在GUI中部分使用面向对象,其它地方我还真用不上。
面向对象在C++里面的地位早也就固定了,决定不再新增新的面向对象特性进去了,现在的C++是一种多泛型语言。 IAR 8051 C++操作IO口早就发过了,用类模板。
#defineIO_TESTIO_TICC_OBJECT_DEF(1,0) //P1_0
uint8 io_read;
int main()
{
IO_TEST<<IO_MAKE_OUT; //设置为输出
IO_TEST<<IO_MAKE_OUT_LOW; //设置为输出,且输出低
IO_TEST<<0<<IO_MAKE_OUT; //设置为输出,且输出低
IO_TEST<<0<<1; //输出低,再输出高
IO_TEST<<1<<0<<IO_TOGGLE; //输出搞,再输出低,再翻转
IO_TEST>>io_read; //读取电平到io_read;
//读到的电平再写回IO口
IO_TEST<<io_read;
while(1);
}
汇编代码:
RSEG NEAR_CODE:CODE:NOROOT(0)
// 6 int main()
main:
CODE
// 7 {
; Auto size: 0
// 8 IO_TEST<<IO_MAKE_OUT; //设置为输出
ORL 0xfe,#0x1
// 9 IO_TEST<<IO_MAKE_OUT_LOW; //设置为输出,且输出低
CLR 0x90.0
ORL 0xfe,#0x1
// 10 IO_TEST<<0<<IO_MAKE_OUT; //设置为输出,且输出低
CLR 0x90.0
ORL 0xfe,#0x1
// 11
// 12 IO_TEST<<0<<1; //输出低,再输出高
CLR 0x90.0
SETB 0x90.0
// 13
// 14 IO_TEST<<1<<0<<IO_TOGGLE; //输出搞,再输出低,再翻转
SETB 0x90.0
CLR 0x90.0
XRL 0x90,#0x1
// 15
// 16 IO_TEST>>io_read; //读取电平到io_read;
MOV C,0x90.0
JNC ??main_0
SETB 0x90.0
SJMP ??main_1
??main_0:
CLR 0x90.0
// 17 //读到的电平再写回IO口
// 18 IO_TEST<<io_read;
// 19 C++ 玩IO口,基本上不管什么MCU,一样的套路。
STM32:
#define GPIO_LED_0 IO_STM32_OBJECT_POLARITY_DEF(B,6,0)
#define GPIO_LED_1 IO_STM32_OBJECT_POLARITY_DEF(B,7,0)
#define GPIO_LED_2 IO_STM32_OBJECT_POLARITY_DEF(B,8,0)
#define GPIO_LED_3 IO_STM32_OBJECT_POLARITY_DEF(B,9,0)
GPIO_LED_0<<IO_OFF<<IO_MAKE_OUT_PP_50M;
GPIO_LED_1<<IO_OFF<<IO_MAKE_OUT_PP_50M;
GPIO_LED_2<<IO_OFF<<IO_MAKE_OUT_PP_50M;
GPIO_LED_3<<IO_OFF<<IO_MAKE_OUT_PP_50M; 谢谢上面各位。 从汇编的源码来看,2楼的IO操作非常高效。怎么很多人批评C++效率低。
但我还是不会这样用。我更想尝试我的写法,但端口没法子作为参数传递给构造函数。在学习仿函数的用法。 C++效率主要低在虚函数,还有滥用模版导致的代码膨胀,另外有异常(setjmp/longjmp, C也不会快)
其它问题基本上都是使用者的功力问题,最常见的莫过于按值而不是按引用传递struct/class. ...........但端口没法子作为参数传递给构造函数。在学习仿函数的用法。
-----------------------------------------------------------------------
用模板。
template <typename T,T &IO_POUT,T &IO_PIN,T &IO_DIR,T &IO_INP,T &IO_SEL,uint8 IO_BIT,uint8 IO_POLARITY=1>
classIO_TICC_CLASS
{
};
#define IO_TICC_OBJECT_DEF(A,B) (IO_TICC_CLASS<uint8 volatile __sfr,P##A,P##A,P##A##DIR,P##A##INP,P##A##SEL,B>::IO_CLASS())
#defineIO_TESTIO_TICC_OBJECT_DEF(1,0) //P1_0 我原来想创建一个指针,指向特殊功能寄存器,查阅了IAR的帮助文档“compiler reference”,对sfr有这么一段描述:http://cache.amobbs.com/bbs_upload782111/files_53/ourdev_725039F4059H.png
(原文件名:sfr.png)
对于端口和位寻址区的描述是http://cache.amobbs.com/bbs_upload782111/files_53/ourdev_725040UFSAMT.png
(原文件名:bit.png)
官方文档清楚的指出,没有sfr指针和位寻址区bit指针。
用模板应该是很不错的方法。看了的7楼的方法。翻书学习模板的内容。似懂非懂。下面不好理解。
template <typename T,T &IO_POUT,T &IO_PIN,T &IO_DIR,T &IO_INP,T &IO_SEL,uint8 IO_BIT,uint8 IO_POLARITY=1>
uc_stm32f050 深圳招M3开发 可否解我疑惑? guolun 发表于 2012-3-8 16:47 static/image/common/back.gif
我原来想创建一个指针,指向特殊功能寄存器,查阅了IAR的帮助文档“compiler reference”,对sfr有这么一段 ...
楼主也可以参考这个帖子的81楼82楼的内容,STM32的例子,用的也是类模板,思路跟4楼的差不多。
http://www.ourdev.cn/thread-5401612-1-1.html
戒骄戒躁,潜心学习!!! 3楼的同学,你用的什么编译器?
页:
[1]