Перейти к содержанию
    

Как избавиться от Warning [408]

Добрый день! Использую RTOS для MSP430F5528, IAR. При компиляции появляется Warning [408] Only 16 bit will be pushed to the stack. Причина ясна (в этом типе MSP430 доступен 20-битный адрес) и не критична, Но хотелось бы избавиться. Help советует перед функцией поставить спецификатор __save_reg_20, но в RTOS запасание контекста оформлено в виде макроса а запасается и выталкивается 14 регистров, столько же вылазит Warning-ов. Пробовал спецификатор перед макросом - не помогает. Не поможет ли кто?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, JohnKorsh сказал:

. . . . При компиляции появляется Warning [408] . . . . Но хотелось бы избавиться. 

Посмотрите #pragma diag_suppress=tag[,tag,...]   (встроенный help IAR) Надо использовать осторожно, тк может удалится полезный warn, diag_warning

Есть такое, когда-то давно "разово" пользовался, точнее не помню. 

Еще в опциях компилятора надо посмотреть уровень диагностики листинга и блокировки warn (надо будет прописать в св-вах компилятора IDE IAR)

ps

image.thumb.png.9c151d180ca94f03d4603aa6b5c973c9.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, JohnKorsh сказал:

Причина ясна (в этом типе MSP430 доступен 20-битный адрес) и не критична, Но хотелось бы избавиться.

Ну если "не критична", то должно помочь:

image.png.63712a2be8d25045254e928f1a9bad11.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. - код у вас использует 20-разрядные адреса, а вы сохраняете/восстанавливаете в стеке только младшие 16 бит адреса и считаете что всё ок??  :shok:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, jcxz said:

т.е. - код у вас использует 20-разрядные адреса, а вы сохраняете/восстанавливаете в стеке только младшие 16 бит адреса и считаете что всё ок??  :shok:

ну пока за 48кб флэша не вылезет - не страшно.

но в целом да, бороться с такими ворнингами их отключением - это пять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...за младшие 64K - он фон-неймановский, исполнять команды (благо если команды) может везде ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

первые ~16к память и периферия, так что флэша до ffff остаётся ~48k

исполнять-то может везде, но после сохранения контекста RTOS и последующем восстановлении из стэка обратно только 16ти бит PC внезапно может ускакать куда-то не туда вниз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Спасибо за ответы. Пересмотрел свой код. FreeRTOS заработал. Для последователей, возможно, пригодиться, как портировал:

1. использовал файлы из port/MSP430X - там для большой памяти (в MSP430 - для малой);

2. в FreeRTOSCOnfig.h заменил заголовок на MSP5528.h;

3. в port.c заменил #pragma прерывания на TIMER0_A0_VECTOR;

4. в main.c написал требуемую функцию vApplicationSetupTimerInterrupt (void) - стандартное прерывание по таймеру A0, только лучше флаг ставить так TA0CCTL0 |= CCIE - при прерывании от сбрасывается сам, не нужно сбрасывать в прерывании.

5. поставил IAR-Options Code Model = Large, Data Model = Smal. Это важно - из ответов - при Smal, действительно "улетал" при возврате из стека.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 час назад, _pv сказал:

ну пока за 48кб флэша не вылезет - не страшно.

Если не вылазит за 64K, то как я писал выше - нужно использовать small модели данных и кода. И все адреса данных и кода будут 16-битными.

Какой смысл использовать другую модель памяти, если всё влазит в 64K? Не понимаю...  :unknw:

3 часа назад, JohnKorsh сказал:

5. поставил IAR-Options Code Model = Large

У вас памяти > 64K?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

Если не вылазит за 64K, то как я писал выше - нужно использовать small модели данных и кода. И все адреса данных и кода будут 16-битными.

Какой смысл использовать другую модель памяти, если всё влазит в 64K? Не понимаю...  :unknw:

я не ТС, что именно там предупреждения вызывает и почему он не модель памяти переключил, а стал бороться с ворнингами их отключением, ответить не могу.

там ещё ряд инструкций типа CALL и RET отличаются у CPU и CPUX, и если уж он взял порт от CPUX то со small моделью какие-нибудь ассемблерные вставки в коде RTOS которые сделают RETA вместо RET и со стека 4 байта заберут вместо двух, могут заработать ещё хуже.

а так хотя бы проблемы начнутся (и придётся делать по нормальному) только при превышении по размеру кода 🙂

2 hours ago, jcxz said:

У вас памяти > 64K?

у MSP430F5528 да 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, _pv сказал:

там ещё ряд инструкций типа CALL и RET отличаются у CPU и CPUX, и если уж он взял порт от CPUX то со small моделью какие-нибудь ассемблерные вставки в коде RTOS которые сделают RETA вместо RET и со стека 4 байта заберут вместо двух, могут заработать ещё хуже.

Трудно представить такие ассемблерные вставки. Очевидно - если даже в компиляторе имеются разные модели памяти (разной разрядности) и набор команд CPU имеет команды для разных моделей памяти, то и ассемблерный код должен быть рассчитан для компиляции с разными моделями памяти. Т.е. - как минимум должны быть ключи условной компиляции asm-кода для разных моделей памяти с генерацией либо CALL/RET либо CALLA/RETA.

Но даже если всё-таки существует некий кривой asm-код, который нужно вызывать только с 20-битным возвратом в стеке из малой модели памяти, то никто не мешает перед CALL записывать в стек 0. Чтобы RETA отрабатывала корректно.

1 час назад, _pv сказал:

у MSP430F5528 да 

Вопрос был не про размер памяти МК, а про размер используемой памяти в прошивке. Какая разница сколько памяти в МК, если прошивка <=64K?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, jcxz сказал:

Вопрос был не про размер памяти МК,

Вы снова начинаете выкручиваться. В следующий раз постарайтесь формулировать вопрос более однозначно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, jcxz said:

Трудно представить такие ассемблерные вставки

и ассемблерный код должен быть рассчитан

обязан просто, но тем не менее iar там на что-то уже ругается, что ему только 16бит сохранили, не смотря на, судя по всему, large модель, раз иар считает что надо все 20 бит хранить.

12 hours ago, jcxz said:

Какая разница сколько памяти в МК, если прошивка <=64K?

а если прошивка <64K (48), то работать будет в любом случае, только с предупреждениями и/или возможно лишним расходом стэка.

никто ж не спорит что для этого случая надо подходящую модель памяти использовать,

вопрос только что ТС будет делать когда за размер прошивки за 48К перевалит, с отключенными предупреждениями, а ассемблерные вставки останутся по прежнему 16ти битными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, _pv сказал:

обязан просто, но тем не менее iar там на что-то уже ругается, что ему только 16бит сохранили, не смотря на, судя по всему, large модель, раз иар считает что надо все 20 бит хранить.

Вангую, что: или ТС смешал объектники/либы, скомпилённые под разные модели памяти; или какая-то функция (ассемблерная?) объявлена как "вызываемая дальним CALLA".

Но да - нужно звать гадалку. Так как ТС темнит.....

10 минут назад, _pv сказал:

а если прошивка <64K (48), то работать будет в любом случае, только с предупреждениями и/или возможно лишним расходом стэка.

Если вызов будет одной разрядности, а возврат - другой, то работать не будет. Стек будет разрушаться.

10 минут назад, _pv сказал:

вопрос только что ТС будет делать когда за размер прошивки за 48К перевалит, с отключенными предупреждениями, а ассемблерные вставки останутся по прежнему 16ти битными.

Точно. :good: Потому я и сказал, что выбранный ТС способ "решения" - это заметание г* под ковёр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...