[AVR单片机] IAR C++能不能定义类到FLASH里?

[复制链接]
 楼主| ATmega32L 发表于 2008-2-12 20:05 | 显示全部楼层 |阅读模式
IAR C++能不能定义类到FLASH里?
hotpower 发表于 2008-2-12 20:16 | 显示全部楼层

晕~~~不住在FLASH里住哪里???实在是晕呀~~~

hotpower 发表于 2008-2-12 20:22 | 显示全部楼层

建议楼主先下载这本书学习完后再玩C++吧~~~

xwj 发表于 2008-2-12 20:24 | 显示全部楼层

呵呵^_^

hotpower 发表于 2008-2-12 20:25 | 显示全部楼层

哈哈~~~看到楼主学C++的心情,俺是"很黄很暴力"~~~佩服~~~

 楼主| ATmega32L 发表于 2008-2-13 15:52 | 显示全部楼层

IAR C++能不能定义类到FLASH里?

IAR C++能不能定义类到FLASH里?
需要把类的所有成员全部定义到FLASH里,不占用RAM空间。
我用IAR怎么弄都不行,出现问题:
1.不能调用成员函数,调用成员函数,编译都不能通过。
2.传递的this指针不是指向FLASH的指针,导致用成员函数读取成员变量出错。(编译出来的汇编代码是读取RAM里面的数据,并非FLASH里面的数据)。


恳请hotpower给个实例。
hotpower 发表于 2008-2-13 16:31 | 显示全部楼层

static const

 楼主| ATmega32L 发表于 2008-2-13 16:48 | 显示全部楼层

static const会导致多个类实体公用一个变量

static const会导致多个类实体公用一个变量。
如果需要定义多个类实体就不好办了。

比如说电子菜单,以前是用定义在FLASH里面的结构体,
现在想用定义在FLASH里面的类,不过好像行不同。
 楼主| ATmega32L 发表于 2008-2-14 19:38 | 显示全部楼层

借用GCC的办法好像可以

#include <stdio.h>
#include <stdint.h>


#define pgm8(A)  (*( uint8_t __flash * )(&(A)))
#define pgm16(A)  (*( uint16_t __flash*)(&(A)))
#define pgm32(A)  (*(uint32_t __flash*)(&(A)))

#define pgm_item(A)   ((TItem  * )&(A))

class  TItem      
{
public:
    uint8_t size;   
    uint8_t * str;    
    TItem  * child;   
    TItem  * parent;  
  
    uint8_t   get_size();
    uint8_t * get_str();
    TItem *   get_child();
    TItem *   get_parent();
    
    
    void sub(void);  
};   

uint8_t  TItem::get_size()
{
  return pgm8(this->size);
}

uint8_t * TItem::get_str()
{
   return (uint8_t *)pgm16(this->str); 
}



__flash TItem Item0;
__flash TItem Item1;
__flash TItem Item3={0xaa,(uint8_t *)"ABCDEFG",pgm_item(Item0),pgm_item(Item1)};

    uint8_t size;   
    uint8_t * str;    
    TItem  * child;   
    TItem  * parent;  

int main()
{
  
 size=pgm_item(Item3)->get_size();
 str=pgm_item(Item3)->get_str();

 while(1);
  
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

376

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部