搜索
bottom↓
回复: 11

IAR写的C++程序,不知道构造函数如何让位变量指向端口?

[复制链接]

出425入0汤圆

发表于 2012-3-1 22:24:56 | 显示全部楼层 |阅读模式
/************************************
初学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.

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-3-2 10:42:58 | 显示全部楼层
51的sfr都是直接寻址,想直接传个sfr的指针是不行的, 要想写个通用的"类", 你只能传仿函数或函数指针进去,建议你先G搜索一下仿函数和函数指针,自己试着写一下先。


另外,面向对象需要谨慎,这玩意很容易导致过度设计,而忽略数据结构和算法,我个人除了在GUI中部分使用面向对象,其它地方我还真用不上。
面向对象在C++里面的地位早也就固定了,决定不再新增新的面向对象特性进去了,现在的C++是一种多泛型语言。

出0入0汤圆

发表于 2012-3-2 11:35:29 | 显示全部楼层
IAR 8051 C++操作IO口早就发过了,用类模板。

#define  IO_TEST  IO_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

出0入0汤圆

发表于 2012-3-2 11:43:47 | 显示全部楼层
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;

出425入0汤圆

 楼主| 发表于 2012-3-2 16:28:24 | 显示全部楼层
谢谢上面各位。

出425入0汤圆

 楼主| 发表于 2012-3-2 20:00:04 | 显示全部楼层
从汇编的源码来看,2楼的IO操作非常高效。怎么很多人批评C++效率低。
但我还是不会这样用。我更想尝试我的写法,但端口没法子作为参数传递给构造函数。在学习仿函数的用法。

出0入0汤圆

发表于 2012-3-2 20:06:48 | 显示全部楼层
C++效率主要低在虚函数,还有滥用模版导致的代码膨胀,另外有异常(setjmp/longjmp, C也不会快)

其它问题基本上都是使用者的功力问题,最常见的莫过于按值而不是按引用传递struct/class.

出0入0汤圆

发表于 2012-3-7 15:24:12 | 显示全部楼层
...........但端口没法子作为参数传递给构造函数。在学习仿函数的用法。
-----------------------------------------------------------------------

用模板。

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>
class  IO_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())


#define  IO_TEST  IO_TICC_OBJECT_DEF(1,0)     //P1_0

出425入0汤圆

 楼主| 发表于 2012-3-8 16:47:57 | 显示全部楼层
我原来想创建一个指针,指向特殊功能寄存器,查阅了IAR的帮助文档“compiler reference”,对sfr有这么一段描述:
(原文件名:sfr.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开发 可否解我疑惑?

出0入0汤圆

发表于 2012-4-17 13:21:02 | 显示全部楼层
guolun 发表于 2012-3-8 16:47
我原来想创建一个指针,指向特殊功能寄存器,查阅了IAR的帮助文档“compiler reference”,对sfr有这么一段 ...

楼主也可以参考这个帖子的81楼82楼的内容,STM32的例子,用的也是类模板,思路跟4楼的差不多。

http://www.ourdev.cn/thread-5401612-1-1.html

出0入0汤圆

发表于 2012-4-17 16:14:23 | 显示全部楼层
戒骄戒躁,潜心学习!!!

出0入0汤圆

发表于 2015-2-27 17:19:14 | 显示全部楼层
3楼的同学,你用的什么编译器?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 00:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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