Как применить экземпляр `__ramfunc` к конструктору? - PullRequest
5 голосов
/ 03 мая 2019

Мне нужно поместить весь мой код в оперативную память (я пишу флеш).Я использую IAR 7.80, и все прекрасно работает с присущим __ramfunc свойством для каждой функции, но не для конструкторов C ++.

Например, у меня есть следующий класс:

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

IЯ не нашел способ определить конструктор Os_Timer в оперативной памяти.Компилятор жалуется

на ожидаемый идентификатор

и

атрибут объекта не разрешен

в конструктореline.

В руководстве IAR сказано, что __ramfunc необходимо поместить перед возвращаемым значением, но конструктор не имеет возвращаемого значения.

Я безуспешно пытался форсировать__ramfunc поведение:

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

и

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

Кто-то знает, как это сделать?

1 Ответ

1 голос
/ 06 мая 2019

Чтобы применить __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 из функции, которая есть.

...