首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带avr __progmem__的c++11广义属性

带avr __progmem__的c++11广义属性
EN

Stack Overflow用户
提问于 2013-06-07 08:03:48
回答 1查看 590关注 0票数 2

以下代码按预期使用avr++4.8.1编译:(代码必须在不同的翻译单元中拆分才能看到任何结果,因为优化器将在内联指令时删除所有效果)

十.h:

代码语言:javascript
复制
struct X
{
    uint8_t a;
};

x.cpp:

代码语言:javascript
复制
extern const X x __attribute__ ((__progmem__)) = { 1 };

main.cpp:

代码语言:javascript
复制
#include "x.h"
extern const X x __attribute__ (( __progmem__ )); 

int main()
{   
    PORTB = pgm_read_byte(& (x.a));
    return 0;
}

结果(objdump -d):

代码语言:javascript
复制
0000001a <x>:
  1a:   01 00                                               ..
  ...

  2e:   ea e1           ldi r30, 0x1A   ; 26
  30:   f0 e0           ldi r31, 0x00   ; 0
  32:   c8 95           lpm

结果很好。

问:为什么不能用c++11编写:

代码语言:javascript
复制
 extern const X x [[__progmem__]] = { 1 };

这会导致一个警告"x.cpp:8:32: warning:'progmem‘属性指令忽略了-Wattributes“,并且代码被中断,因为var x存储为ram而不是闪存。

下一个问题是类方法的使用,类方法必须处理与闪存或ram中的存储不同的数据成员。

a.h:

代码语言:javascript
复制
    class A
    {
        private:
            uint8_t a;

        public:
            constexpr A( uint8_t _a): a(_a) {}

            void Store() const; // Q:should be something like const __attribute__((__PROGMEM__)) ???
            void Store();
    };

a.cpp:

代码语言:javascript
复制
   #include "a.h"

    void A::Store() const
    {   
        PORTB=pgm_read_byte(&a);
    }   

    void A::Store() 
    {   
        PORTB=a;
    }   

    extern const A a_const PROGMEM ={ 0x88 };
    A a_non_const={ 0x99 };

main.cpp:

代码语言:javascript
复制
extern const A a_const;
extern A a_non_const;


int main()
{
    a_const.Store();
    a_non_const.Store();

    return 0;
}

代码运行良好,但如果var声明为:

代码语言:javascript
复制
extern const A a_const_non_flash={ 0x11 };

因为"void () const“的限定符const不足以确定var存储在flash/ram中。这有什么诡计吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-24 08:48:26

我问题的第一部分的解决办法很简单:

代码语言:javascript
复制
extern const X x __attribute__ ((__progmem__)) = { 1 };
extern const X x [[gnu::__progmem__]] = { 1 };

问题在于属性之前缺少的gnu::。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16979123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档