JohnKorsh 1 20 октября, 2022 Опубликовано 20 октября, 2022 · Жалоба Добрый день! Использую RTOS для MSP430F5528, IAR. При компиляции появляется Warning [408] Only 16 bit will be pushed to the stack. Причина ясна (в этом типе MSP430 доступен 20-битный адрес) и не критична, Но хотелось бы избавиться. Help советует перед функцией поставить спецификатор __save_reg_20, но в RTOS запасание контекста оформлено в виде макроса а запасается и выталкивается 14 регистров, столько же вылазит Warning-ов. Пробовал спецификатор перед макросом - не помогает. Не поможет ли кто? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 20 октября, 2022 Опубликовано 20 октября, 2022 · Жалоба 8 часов назад, JohnKorsh сказал: . . . . При компиляции появляется Warning [408] . . . . Но хотелось бы избавиться. Посмотрите #pragma diag_suppress=tag[,tag,...] (встроенный help IAR) Надо использовать осторожно, тк может удалится полезный warn, diag_warning Есть такое, когда-то давно "разово" пользовался, точнее не помню. Еще в опциях компилятора надо посмотреть уровень диагностики листинга и блокировки warn (надо будет прописать в св-вах компилятора IDE IAR) ps Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 20 октября, 2022 Опубликовано 20 октября, 2022 · Жалоба 10 часов назад, JohnKorsh сказал: Причина ясна (в этом типе MSP430 доступен 20-битный адрес) и не критична, Но хотелось бы избавиться. Ну если "не критична", то должно помочь: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnKorsh 1 23 октября, 2022 Опубликовано 23 октября, 2022 · Жалоба Добрый день! Спасибо. Помог совет К155la3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 23 октября, 2022 Опубликовано 23 октября, 2022 · Жалоба т.е. - код у вас использует 20-разрядные адреса, а вы сохраняете/восстанавливаете в стеке только младшие 16 бит адреса и считаете что всё ок?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 23 октября, 2022 Опубликовано 23 октября, 2022 · Жалоба 4 hours ago, jcxz said: т.е. - код у вас использует 20-разрядные адреса, а вы сохраняете/восстанавливаете в стеке только младшие 16 бит адреса и считаете что всё ок?? ну пока за 48кб флэша не вылезет - не страшно. но в целом да, бороться с такими ворнингами их отключением - это пять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 23 октября, 2022 Опубликовано 23 октября, 2022 · Жалоба ...за младшие 64K - он фон-неймановский, исполнять команды (благо если команды) может везде ;-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 23 октября, 2022 Опубликовано 23 октября, 2022 · Жалоба первые ~16к память и периферия, так что флэша до ffff остаётся ~48k исполнять-то может везде, но после сохранения контекста RTOS и последующем восстановлении из стэка обратно только 16ти бит PC внезапно может ускакать куда-то не туда вниз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnKorsh 1 24 октября, 2022 Опубликовано 24 октября, 2022 · Жалоба Добрый день! Спасибо за ответы. Пересмотрел свой код. 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, действительно "улетал" при возврате из стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 24 октября, 2022 Опубликовано 24 октября, 2022 · Жалоба 21 час назад, _pv сказал: ну пока за 48кб флэша не вылезет - не страшно. Если не вылазит за 64K, то как я писал выше - нужно использовать small модели данных и кода. И все адреса данных и кода будут 16-битными. Какой смысл использовать другую модель памяти, если всё влазит в 64K? Не понимаю... 3 часа назад, JohnKorsh сказал: 5. поставил IAR-Options Code Model = Large У вас памяти > 64K? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 24 октября, 2022 Опубликовано 24 октября, 2022 · Жалоба 1 hour ago, jcxz said: Если не вылазит за 64K, то как я писал выше - нужно использовать small модели данных и кода. И все адреса данных и кода будут 16-битными. Какой смысл использовать другую модель памяти, если всё влазит в 64K? Не понимаю... я не ТС, что именно там предупреждения вызывает и почему он не модель памяти переключил, а стал бороться с ворнингами их отключением, ответить не могу. там ещё ряд инструкций типа CALL и RET отличаются у CPU и CPUX, и если уж он взял порт от CPUX то со small моделью какие-нибудь ассемблерные вставки в коде RTOS которые сделают RETA вместо RET и со стека 4 байта заберут вместо двух, могут заработать ещё хуже. а так хотя бы проблемы начнутся (и придётся делать по нормальному) только при превышении по размеру кода 🙂 2 hours ago, jcxz said: У вас памяти > 64K? у MSP430F5528 да Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 24 октября, 2022 Опубликовано 24 октября, 2022 · Жалоба 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба 10 часов назад, jcxz сказал: Вопрос был не про размер памяти МК, Вы снова начинаете выкручиваться. В следующий раз постарайтесь формулировать вопрос более однозначно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба 12 hours ago, jcxz said: Трудно представить такие ассемблерные вставки и ассемблерный код должен быть рассчитан обязан просто, но тем не менее iar там на что-то уже ругается, что ему только 16бит сохранили, не смотря на, судя по всему, large модель, раз иар считает что надо все 20 бит хранить. 12 hours ago, jcxz said: Какая разница сколько памяти в МК, если прошивка <=64K? а если прошивка <64K (48), то работать будет в любом случае, только с предупреждениями и/или возможно лишним расходом стэка. никто ж не спорит что для этого случая надо подходящую модель памяти использовать, вопрос только что ТС будет делать когда за размер прошивки за 48К перевалит, с отключенными предупреждениями, а ассемблерные вставки останутся по прежнему 16ти битными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба 10 минут назад, _pv сказал: обязан просто, но тем не менее iar там на что-то уже ругается, что ему только 16бит сохранили, не смотря на, судя по всему, large модель, раз иар считает что надо все 20 бит хранить. Вангую, что: или ТС смешал объектники/либы, скомпилённые под разные модели памяти; или какая-то функция (ассемблерная?) объявлена как "вызываемая дальним CALLA". Но да - нужно звать гадалку. Так как ТС темнит..... 10 минут назад, _pv сказал: а если прошивка <64K (48), то работать будет в любом случае, только с предупреждениями и/или возможно лишним расходом стэка. Если вызов будет одной разрядности, а возврат - другой, то работать не будет. Стек будет разрушаться. 10 минут назад, _pv сказал: вопрос только что ТС будет делать когда за размер прошивки за 48К перевалит, с отключенными предупреждениями, а ассемблерные вставки останутся по прежнему 16ти битными. Точно. Потому я и сказал, что выбранный ТС способ "решения" - это заметание г* под ковёр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться