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

haker_fox

Модератор
  • Постов

    7 287
  • Зарегистрирован

  • Посещение

  • Победитель дней

    12

Весь контент haker_fox


  1. EXTI_STM32F103

    Только, если такие прерывания будут не одиночные по отношению к уже обрабатываемому прерыванию - будет потеря событий, что говорит о неверном дизайне системы. Хотя, не обязательно. Если это какая-нибудь кнопка, то дребезг, породивший N событий, не так страшен.
  2. EXTI_STM32F103

    Период следования прерывания должен быть больше суммарного времени его обработки, входа и выхода из прерывания. Иначе неизбежен их пропуск.
  3. Будьте терпеливее. Это всё же форум, а не частная консультация. Сейчас выходные. Люди на дачах и огородах могут быть. Или, уточнив что-либо, поняли, что ответить не могут. Не надо пытаться вытребовать ответ.
  4. Красиво! Сами делали? Я вот для SlickEdit ленюсь сделать подсветку для icf. Всё никак не возьмусь за это.
  5. Понял) Спасибо за мнение! Может быть ко власти пришли эффективные менеджеры...
  6. Уф) Самое главное, что совместными усилиями нам удалось отдать верный и нужный приказ инструментарию) Надеюсь, что данный топик принесёт пользу коллегам по форуму💗 По правде говоря, я даже не рассчитывал на такое) Ведь запуск чужого кода на своём железе - трата собственного времени, что не всегда возможно)))
  7. Шведы) Они пока ещё шведы) А так - да, как Вы и говорили в другом посте: мощная оптимизация со средствами борьбы против её последствий)
  8. Вах! А это спасло отца русской демократии, т.е. меня! Вот это да! Спасибище!!!! 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-коде нет.
  9. На новые IARы переходить, как я вижу, Вы не спешите))) Как я понимаю, в этой версии Вам уже известны все его шаблоны поведения. А в новых продуктах возможно и новые баги появились😀
  10. Модератор: @passer_by, на форуме принято общение на русском языке. А это значит, что выражать свои мысли следует грамматически верно и связанно. Старайтесь избегать пространственных рассуждений на отвлечённые темы, которые сильно запутывают поставленный вопрос, а также не употребляйте бранные выражения. Всё это написано в правилах форума, которые я рекомендую Вам перечитать. Пока Ваше сообщение я отредактировал самостоятельно. Прошу быть наперёд аккуратнее.
  11. Сделал всё также) Действительно, никаких ошибок или предупреждений. Светодиод теперь зависит от состояния переменной: Скрипт линкера выглядит вот так: Инициализация константы написана таким обрзаом: Но при запуске процессор попадает в HardFault. Расшифровка показала, что проблема тут: А в R0 находится адрес 0x0800DC00. Т.е. startup-код пытается инициализировать константный объект. Из документации на линкер следует, что директива do not initialize относится только к секциям типа zeroinit, т.е. в данном случае она не работает(((
  12. А где красота кода? Оперировать в сишнике адресами - дурной тон, ИМХО. Для этого линкер есть. Угу) Ух, спасибо! Я чувствовал, что у Вас будет индивидуальный рецепт, как всегда💗 Завтра буду пробовать на работе) Это внушает надежду!🤝🙏
  13. Всё же выходит, что поставленная проблема в топике - нетривиальная?)))) Интересно бы ещё услышать, что уважаемый @jcxz скажет)))
  14. А я вот выше показал, что у меня такой подход с включенной оптимизацией balanced или speed не приводит к результату. Даже если указатель на структуру объявлен со словом volatile. Данные из флеши читаются, да. Но не используются. Что не противоречит стандарту.
  15. Даже так не работает. Похоже, что компилятор видит обращение к знакомой константе (с его точки зрения), и уже ничего не помогает!
  16. Перепишу память с помощью контроллера памяти. Да и это переписывается. Всё работает. Пока уровень оптимизации низкий. P.S. Забить на всё. Сдать проект с отключенной оптимизацией. там кода чуть-чуть. Это датчик...
  17. Посмотрел листинг. Если 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] Спасибо за наставления, конечно, но к делу это отношения не имеет😀
  18. Ничего не меняет( // header volatile const CalInfo calInfo @ ".calInfo" { // map calInfo 0x2000'0000 0x200c Data Lc main.o [1] Тогда я не знаю, что её заставляет укладываться в ОЗУ...
  19. volatile добавляет ей rw? Обыскался в инете, не могу найти прямого подтверждения этому(( Попробую! Спасибо!
  20. Попробую. По сути блок нужен, чтобы занять N 1024-байтных страниц флеши. И не допустить попадания туда посторонней информации. Т.к. флешь стирается секторами. В принципе, этот блок необязателен. Ведь можно просто подрезать границы для readonly секции, куда помещается код и константы.
  21. Теперь внаглую увеличил объём ОЗУ, такого, конечно нет. И всё легло! Но во флешь! 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]
  22. Чёт мне уже кажется, что я ничего не понимаю в инструменте...
  23. Вообще непонятно. Размер секции он посчитал верно: 9кБ. Но обозначил её как readwrite. Т.е. пытается разместить в ОЗУ. Но выше в сообщении пишет, что уже не может разместить 0x2838 байт, т.е. 10 206 байт, а это не 9 кБ. Блин. Вообще запутался.
  24. Пробовал) В R0 читается значение, но не используется. Я и говорю, что в ОЗУ эта константа не должна размещаться) Она должна лежать во флешь! Но если добавить volatile, то линкер в обход правил её туда пытается запихнуть. Вы дописали своё сообщение. Увидел позже. Но я и не могу в этом разобраться. Я же приложил скрипт) Там явно указано, куда размещать эту огромную константу)
×
×
  • Создать...