-
Постов
7 287 -
Зарегистрирован
-
Посещение
-
Победитель дней
12
Весь контент haker_fox
-
Только, если такие прерывания будут не одиночные по отношению к уже обрабатываемому прерыванию - будет потеря событий, что говорит о неверном дизайне системы. Хотя, не обязательно. Если это какая-нибудь кнопка, то дребезг, породивший N событий, не так страшен.
-
Период следования прерывания должен быть больше суммарного времени его обработки, входа и выхода из прерывания. Иначе неизбежен их пропуск.
-
Будьте терпеливее. Это всё же форум, а не частная консультация. Сейчас выходные. Люди на дачах и огородах могут быть. Или, уточнив что-либо, поняли, что ответить не могут. Не надо пытаться вытребовать ответ.
-
Красиво! Сами делали? Я вот для SlickEdit ленюсь сделать подсветку для icf. Всё никак не возьмусь за это.
-
Понял) Спасибо за мнение! Может быть ко власти пришли эффективные менеджеры...
-
Уф) Самое главное, что совместными усилиями нам удалось отдать верный и нужный приказ инструментарию) Надеюсь, что данный топик принесёт пользу коллегам по форуму💗 По правде говоря, я даже не рассчитывал на такое) Ведь запуск чужого кода на своём железе - трата собственного времени, что не всегда возможно)))
-
Шведы) Они пока ещё шведы) А так - да, как Вы и говорили в другом посте: мощная оптимизация со средствами борьбы против её последствий)
-
Вах! А это спасло отца русской демократии, т.е. меня! Вот это да! Спасибище!!!! static const volatile __ro_placement CalInfo calInfo @ ".calInfo" { Оптимизация: spee, no size constraint. Содержимое скрипта линкера: Данные из map-файла: "A1", part 1 of 2: 0x200c CAL_INFO_BLOCK 0x800'dc00 0x2400 <Block> .calInfo const 0x800'dc00 0x200c main.o [1] - 0x800'fc0c 0x200c calInfo 0x800'dc00 0x200c Data Lc main.o [1] Кусок листинга со светодиодом: Попытки инициализации в startup-коде нет.
-
На новые IARы переходить, как я вижу, Вы не спешите))) Как я понимаю, в этой версии Вам уже известны все его шаблоны поведения. А в новых продуктах возможно и новые баги появились😀
-
Модератор: @passer_by, на форуме принято общение на русском языке. А это значит, что выражать свои мысли следует грамматически верно и связанно. Старайтесь избегать пространственных рассуждений на отвлечённые темы, которые сильно запутывают поставленный вопрос, а также не употребляйте бранные выражения. Всё это написано в правилах форума, которые я рекомендую Вам перечитать. Пока Ваше сообщение я отредактировал самостоятельно. Прошу быть наперёд аккуратнее.
-
Сделал всё также) Действительно, никаких ошибок или предупреждений. Светодиод теперь зависит от состояния переменной: Скрипт линкера выглядит вот так: Инициализация константы написана таким обрзаом: Но при запуске процессор попадает в HardFault. Расшифровка показала, что проблема тут: А в R0 находится адрес 0x0800DC00. Т.е. startup-код пытается инициализировать константный объект. Из документации на линкер следует, что директива do not initialize относится только к секциям типа zeroinit, т.е. в данном случае она не работает(((
-
А где красота кода? Оперировать в сишнике адресами - дурной тон, ИМХО. Для этого линкер есть. Угу) Ух, спасибо! Я чувствовал, что у Вас будет индивидуальный рецепт, как всегда💗 Завтра буду пробовать на работе) Это внушает надежду!🤝🙏
-
Всё же выходит, что поставленная проблема в топике - нетривиальная?)))) Интересно бы ещё услышать, что уважаемый @jcxz скажет)))
-
А я вот выше показал, что у меня такой подход с включенной оптимизацией balanced или speed не приводит к результату. Даже если указатель на структуру объявлен со словом volatile. Данные из флеши читаются, да. Но не используются. Что не противоречит стандарту.
-
Даже так не работает. Похоже, что компилятор видит обращение к знакомой константе (с его точки зрения), и уже ничего не помогает!
-
Перепишу память с помощью контроллера памяти. Да и это переписывается. Всё работает. Пока уровень оптимизации низкий. P.S. Забить на всё. Сдать проект с отключенной оптимизацией. там кода чуть-чуть. Это датчик...
-
Посмотрел листинг. Если calInfo расположена в ОЗУ, что, конечно же неправильно, то данные переменной читаются и, что главное, учитываются! 322 s_calLed::set(!isCalibrated()); \ ??main_12: (+1) \ 0x5A2 0x.... LDR R1,??DataTable2_14 \ 0x5A4 0x7A08 LDRB R0,[R1, #+8] \ 0x5A6 0x2800 CMP R0,#+0 \ 0x5A8 0xD002 BEQ ??main_33 \ 0x5AA 0x2080 MOVS R0,#+128 \ 0x5AC 0x03C0 LSLS R0,R0,#+15 \ 0x5AE 0xE000 B ??main_34 \ ??main_33: (+1) \ 0x5B0 0x2040 MOVS R0,#+64 \ ??main_34: (+1) \ 0x5B2 0x2290 MOVS R2,#+144 \ 0x5B4 0x05D2 LSLS R2,R2,#+23 \ 0x5B6 0x6190 STR R0,[R2, #+24] Спасибо за наставления, конечно, но к делу это отношения не имеет😀
-
Ничего не меняет( // header volatile const CalInfo calInfo @ ".calInfo" { // map calInfo 0x2000'0000 0x200c Data Lc main.o [1] Тогда я не знаю, что её заставляет укладываться в ОЗУ...
-
volatile добавляет ей rw? Обыскался в инете, не могу найти прямого подтверждения этому(( Попробую! Спасибо!
-
Нет. Бесполезно. Кладёт в ОЗУ(((
-
Попробую. По сути блок нужен, чтобы занять N 1024-байтных страниц флеши. И не допустить попадания туда посторонней информации. Т.к. флешь стирается секторами. В принципе, этот блок необязателен. Ведь можно просто подрезать границы для readonly секции, куда помещается код и константы.
-
Теперь внаглую увеличил объём ОЗУ, такого, конечно нет. И всё легло! Но во флешь! define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x20002FFF; Там ни одна функция читает из этой константы... Да и хочу уже понять, а что такое происходит. Это же мой профессиональный рост... P.S. Возникает ощущение, что блоку CAL_INFO_BLOCL назначается аттрибут rw, линкер смотрит на это и примеряет блок к ОЗУ. Не входит? Пофиг, что нужно реально класть по другому адресу. Выдаём ошибку. Увеличили ОЗУ. Блок входит. Но кладём в флешь по указанному адресу. P.S.S. Секции он уложил во флешь. А саму переменную calInfo в ОЗУ! calInfo 0x2000'0000 0x200c Data Gb main.o [1]
-
-
Вообще непонятно. Размер секции он посчитал верно: 9кБ. Но обозначил её как readwrite. Т.е. пытается разместить в ОЗУ. Но выше в сообщении пишет, что уже не может разместить 0x2838 байт, т.е. 10 206 байт, а это не 9 кБ. Блин. Вообще запутался.
-
Пробовал) В R0 читается значение, но не используется. Я и говорю, что в ОЗУ эта константа не должна размещаться) Она должна лежать во флешь! Но если добавить volatile, то линкер в обход правил её туда пытается запихнуть. Вы дописали своё сообщение. Увидел позже. Но я и не могу в этом разобраться. Я же приложил скрипт) Там явно указано, куда размещать эту огромную константу)