Jump to content
    

Как избавиться от 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-ов. Пробовал спецификатор перед макросом - не помогает. Не поможет ли кто?

Share this post


Link to post
Share on other sites

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

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

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

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

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

ps

image.thumb.png.9c151d180ca94f03d4603aa6b5c973c9.png

Share this post


Link to post
Share on other sites

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

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

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

image.png.63712a2be8d25045254e928f1a9bad11.png

Share this post


Link to post
Share on other sites

Добрый день! Спасибо. Помог совет К155la3.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

4 hours ago, jcxz said:

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Добрый день! Спасибо за ответы. Пересмотрел свой код. 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, действительно "улетал" при возврате из стека.

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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 да 

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

12 hours ago, jcxz said:

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

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

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

12 hours ago, jcxz said:

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...