【问题标题】:How to apply the `__ramfunc` instrinsic to a constructor?如何将`_ ramfunc`内在的应用于构造函数?
【发布时间】:2019-09-21 20:54:15
【问题描述】:

我需要将所有代码放入 ram 中(我正在编写闪存)。我正在使用 IAR 7.80,并且每个函数的 __ramfunc 内在函数都可以正常工作,但对于 C++ 构造函数则不行。

例如我有以下课程:

class Os_Timer {
  private:
    os_tmrcnt_t tmr;
  public:
    __ramfunc Os_Timer() { reset(); }
    __ramfunc void reset() { os_TimerStart( &tmr ); }
};

我还没有找到在 ram 中定义构造函数 Os_Timer 的方法。编译器抱怨

需要一个标识符

对象属性不允许

在构造函数行。

IAR 手册说__ramfunc 必须放在返回值之前,但构造函数没有返回值。

我尝试强制 __ramfunc 行为没有成功:

_Pragma("location=\"section  .textrw\"") 

_Pragma("location=\"RAM_region\"") 

有人知道怎么做吗?

【问题讨论】:

  • C++ 标准有一个答案——像这样的属性应该写成[[__ramfunc]]。但似乎 IAR 并没有遵循 C++ 标准并组成了自己的扩展。正是这种与标准的偏差直接导致了您的问题。

标签: c++ constructor embedded iar


【解决方案1】:

要将__ramfunc 应用于C++ 构造函数,您必须使用_Pragma("object_attribute=__ramfunc"),如下例所示。

class Os_Timer
{
private:
  os_tmrcnt_t tmr;

public:
  _Pragma("object_attribute=__ramfunc") Os_Timer() { reset(); }
  __ramfunc void reset() { os_TimerStart(&tmr); }
};

请注意,要使其正常工作,os_TimerStart 也应声明为 __ramfunc,否则 os_TimerStart 将被放置在闪存中并可能被您的闪存更新覆盖。为了帮助您检测到这一点,如果您尝试从已声明的函数调用未声明为 __ramfunc 的函数,编译器将发出警告。

【讨论】:

  • 很好用!非常感谢!编译器警告我 ramfunc 使用的函数和变量(来自 ramfunc 的 rom 访问)。不幸的是,IAR(至少是 7.80 版本)没有对构造函数发出相同的警告。
猜你喜欢
  • 2011-08-26
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多