IAR правильно, регистры не RAM.:) Возможно, лучше всего посмотреть, как подавить предупреждения, просматривая примеры, идущие с IAR (если есть).Это может быть пользовательское ключевое слово IAR или прагма, что говорит компилятору, как вы собираетесь это делать.
Это также может быть проблемой в карте памяти, поскольку может потребоваться как-то определить регистр.
Я работаю с GCC и ARM, и он не жалуется ни на какой метод доступа к регистрам.Я использовал:
- прямой и вычисленный адрес (
*((volatile unsigned int *)0xNNNNNNNNU) |= 1<<pin
); - массивы, структуры, объединения и битовые поля по прямому адресу (через это опасно, но это делает код такимnice);
- символы, определенные в файле карты со всеми вышеперечисленными (это может быть в основном C-совместимым из-за работы с компоновщиком, а не с компилятором).
Предлагается новое расширение, претендующее набыть стандартом, который я недавно обнаружил и который называется TR 18037: Embedded C .В разделе «6 ОСНОВНОЕ АДРЕС ОБОРУДОВАНИЯ В / В» дается общий метод доступа к оборудованию (см. Pdf):
#include <iohw.h>
#include "iodriv_hw.h" /* Platform-specific designator
definitions. */
// Wait until controller is no longer busy.
while (iord(dev_status) & STATUS_BUSY) /* do nothing */;
// Write value to controller.
iowr(dev_out, ch);
Есть также функции ioand
, ioor
[например, макрос] и многие другие..
Пример реализации для iohw.h также есть, поэтому вы можете добавить поддержку для этого в IAR самостоятельно.