-
Постов
7 287 -
Зарегистрирован
-
Посещение
-
Победитель дней
12
Сообщения, опубликованные haker_fox
-
-
2 hours ago, Xenia said:
А я наоборот опасалась, что если сниму флаг прерывания раньше, чем закончу выполнять обработчик, то прерывание сможет возникнуть еще раз, после чего станет неясно, какой из обработчиков выполнится первым.
Период следования прерывания должен быть больше суммарного времени его обработки, входа и выхода из прерывания. Иначе неизбежен их пропуск.
-
4 hours ago, passer_by said:
всё равно желанья нет какую-нибудь мысль хорошую здесь обнародовать?
Будьте терпеливее. Это всё же форум, а не частная консультация. Сейчас выходные. Люди на дачах и огородах могут быть. Или, уточнив что-либо, поняли, что ответить не могут. Не надо пытаться вытребовать ответ.
-
12 minutes ago, uni said:
Ещё у меня есть icf-раскраска для Notepad++
Красиво! Сами делали? Я вот для SlickEdit ленюсь сделать подсветку для icf. Всё никак не возьмусь за это.
-
8 minutes ago, jcxz said:
А это всё ерунда и не нужно.
Понял) Спасибо за мнение!
Just now, jcxz said:И никакого прогресса (в новых IAR-ах)
Может быть ко власти пришли эффективные менеджеры...
-
3 minutes ago, jcxz said:
Да, Вы правы
Уф) Самое главное, что совместными усилиями нам удалось отдать верный и нужный приказ инструментарию) Надеюсь, что данный топик принесёт пользу коллегам по форуму💗
4 minutes ago, jcxz said:Вчера я не пробовал запускать ваш код на реальном камне
По правде говоря, я даже не рассчитывал на такое) Ведь запуск чужого кода на своём железе - трата собственного времени, что не всегда возможно)))
-
2 minutes ago, Arlleex said:
Вот я и говорил, немцы хоть и немного напридумывали насчет RAM, но задокументировали свои мысли))
Шведы) Они пока ещё шведы) А так - да, как Вы и говорили в другом посте: мощная оптимизация со средствами борьбы против её последствий)
-
19 hours ago, pyroman said:
a const volatile object, declare it with the __ro_placement attribute. See
Вах! А это спасло отца русской демократии, т.е. меня! Вот это да! Спасибище!!!!
static const volatile __ro_placement CalInfo calInfo @ ".calInfo" {
Оптимизация: spee, no size constraint.
Содержимое скрипта линкера:
Spoiler/*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; define symbol CAL_INFO_PAGE_COUNT = 9; define symbol CAL_INFO_PAGE_SIZE = 1024; define block CAL_INFO_BLOCK with alignment = 8, size = CAL_INFO_PAGE_COUNT * CAL_INFO_PAGE_SIZE, fixed order {readonly section .calInfo}; place at address mem: 0x0800DC00 {block CAL_INFO_BLOCK}; place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP }; export symbol __ICFEDIT_region_RAM_start__; export symbol __ICFEDIT_region_RAM_end__;
Данные из 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]
Кусок листинга со светодиодом:
Spoiler321 322 s_calLed::set(!isCalibrated()); \ ??main_16: (+1) \ 0x630 0x.... LDR R1,??DataTable2_14 \ 0x632 0x7A08 LDRB R0,[R1, #+8] \ 0x634 0x2800 CMP R0,#+0 \ 0x636 0xD002 BEQ ??main_36 \ 0x638 0x2080 MOVS R0,#+128 \ 0x63A 0x03C0 LSLS R0,R0,#+15 \ 0x63C 0xE000 B ??main_37 \ ??main_36: (+1) \ 0x63E 0x9801 LDR R0,[SP, #+4] \ ??main_37: (+1) \ 0x640 0x2290 MOVS R2,#+144 \ 0x642 0x05D2 LSLS R2,R2,#+23 \ 0x644 0x6190 STR R0,[R2, #+24] 323
Попытки инициализации в startup-коде нет.
-
13 hours ago, jcxz said:
PS: IAR v7.80.4 for ARM.
На новые IARы переходить, как я вижу, Вы не спешите))) Как я понимаю, в этой версии Вам уже известны все его шаблоны поведения. А в новых продуктах возможно и новые баги появились😀
-
Модератор: @passer_by, на форуме принято общение на русском языке. А это значит, что выражать свои мысли следует грамматически верно и связанно. Старайтесь избегать пространственных рассуждений на отвлечённые темы, которые сильно запутывают поставленный вопрос, а также не употребляйте бранные выражения. Всё это написано в правилах форума, которые я рекомендую Вам перечитать. Пока Ваше сообщение я отредактировал самостоятельно. Прошу быть наперёд аккуратнее.
-
12 hours ago, jcxz said:
И никаких ошибок или варнингов при компиляции.
Сделал всё также)
Действительно, никаких ошибок или предупреждений.
Светодиод теперь зависит от состояния переменной:
Spoiler321 322 s_calLed::set(!isCalibrated()); \ ??main_13: (+1) \ 0x402 0x.... LDR R1,??DataTable2_14 \ 0x404 0x7A08 LDRB R0,[R1, #+8] \ 0x406 0x2800 CMP R0,#+0 \ 0x408 0xD00E BEQ ??main_34 \ 0x40A 0x2080 MOVS R0,#+128 \ 0x40C 0x03C0 LSLS R0,R0,#+15 \ 0x40E 0xE00C B ??main_35 \ ??main_2: \ 0x410 0xE000'E100 DC32 0xe000e100 \ 0x414 0x....'.... DC32 s_generalCal \ 0x418 0x0003'EFD0 DC32 0x3efd0 \ 0x41C 0x0000'2198 DC32 0x2198 \ 0x420 0x0001'F7E8 DC32 0x1f7e8 \ 0x424 0x0001'4FF0 DC32 0x14ff0 \ ??main_34: (+1) \ 0x428 0x2040 MOVS R0,#+64 \ ??main_35: (+1) \ 0x42A 0x2290 MOVS R2,#+144 \ 0x42C 0x05D2 LSLS R2,R2,#+23 \ 0x42E 0x6190 STR R0,[R2, #+24]
Скрипт линкера выглядит вот так:
Spoiler/*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x0800DBFF; define symbol CAL_INFO_ROM_START = 0x0800DC00; define symbol CAL_INFO_ROM_END = 0x0800FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_heap__ = 0; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; define region CAL_INFO_BLOCK = mem:[ from CAL_INFO_ROM_START to CAL_INFO_ROM_END]; do not initialize {section .calInfo}; place in CAL_INFO_BLOCK {section .calInfo}; place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP }; export symbol __ICFEDIT_region_RAM_start__; export symbol __ICFEDIT_region_RAM_end__;
Инициализация константы написана таким обрзаом:
Spoiler#pragma pack(push, 2) // flash writing by 2 bytes only struct GeneralCal { uint16_t z0; uint16_t z1; uint16_t z2; uint16_t z3; bool calibrated; }; #pragma pack(pop) #pragma pack(push, 1) struct CalInfo { GeneralCal general; uint16_t tbl[4096]; }; __root volatile const CalInfo calInfo @ ".calInfo" { { 3502, 3318, 369, 184, // see readme.md false, },{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002 и т.д.
Но при запуске процессор попадает в HardFault. Расшифровка показала, что проблема тут:
А в R0 находится адрес 0x0800DC00. Т.е. startup-код пытается инициализировать константный объект.
Из документации на линкер следует, что директива do not initialize относится только к секциям типа zeroinit, т.е. в данном случае она не работает(((
-
1 hour ago, vit496 said:
читать uint32_t x = *(volatile uint32_t*) 0x08070000
А где красота кода? Оперировать в сишнике адресами - дурной тон, ИМХО. Для этого линкер есть.
1 hour ago, Arlleex said:т.к. при банальной смене распределения памяти все уедет и по новой сиди адреса правь.
Угу)
45 minutes ago, jcxz said:я не вижу у Вас в скрипте компоновщика задания способа инициализации для секции ".calInfo".
Ух, спасибо! Я чувствовал, что у Вас будет индивидуальный рецепт, как всегда💗 Завтра буду пробовать на работе)
29 minutes ago, jcxz said:Как видно - и читается и используется в коде calInfo.general.calibrated правильно.
Это внушает надежду!🤝🙏
-
1 minute ago, Arlleex said:
Ну тогда пусть линкер считает, что это RW область, а адреса подпихните из нужной области Flash.
Всё же выходит, что поставленная проблема в топике - нетривиальная?))))
Интересно бы ещё услышать, что уважаемый @jcxz скажет)))
-
6 minutes ago, KSN said:
Использую такой подход:
А я вот выше показал, что у меня такой подход с включенной оптимизацией balanced или speed не приводит к результату. Даже если указатель на структуру объявлен со словом volatile. Данные из флеши читаются, да. Но не используются. Что не противоречит стандарту.
-
-
2 minutes ago, vit496 said:
А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH?
Перепишу память с помощью контроллера памяти. Да и это переписывается. Всё работает. Пока уровень оптимизации низкий.
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]
1 minute ago, MrYuran said:Профессиональный рост - это когда растет количество подчиненных )
А флешь после череды инцидентов лично я читаю/пишу в строго определенной функции с контролем целостности данных посредством CRC
Спасибо за наставления, конечно, но к делу это отношения не имеет😀
-
3 minutes ago, vit496 said:
отсутствие const
Ничего не меняет(
// header volatile const CalInfo calInfo @ ".calInfo" { // map calInfo 0x2000'0000 0x200c Data Lc main.o [1]
3 minutes ago, Arlleex said:Разумеется, нет.
Тогда я не знаю, что её заставляет укладываться в ОЗУ...
-
2 minutes ago, vit496 said:
изменяемую
volatile добавляет ей rw? Обыскался в инете, не могу найти прямого подтверждения этому((
2 minutes ago, vit496 said:int32_t x = *(__IO uint32_t*) 0x08001000;
Попробую! Спасибо!
-
19 minutes ago, Arlleex said:
lace at address mem: 0x0800D400 {readonly section .calInfo, block CAL_INFO_BLOCK}
Нет. Бесполезно. Кладёт в ОЗУ(((
-
Попробую. По сути блок нужен, чтобы занять N 1024-байтных страниц флеши. И не допустить попадания туда посторонней информации. Т.к. флешь стирается секторами. В принципе, этот блок необязателен. Ведь можно просто подрезать границы для readonly секции, куда помещается код и константы.
-
Теперь внаглую увеличил объём ОЗУ, такого, конечно нет. И всё легло! Но во флешь!
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20002FFF;1 minute ago, MrYuran said:А может, таки взять и запретить оптимизировать? Поставить прагму на функцию чтения флеши
Там ни одна функция читает из этой константы... Да и хочу уже понять, а что такое происходит. Это же мой профессиональный рост...
P.S. Возникает ощущение, что блоку CAL_INFO_BLOCL назначается аттрибут rw, линкер смотрит на это и примеряет блок к ОЗУ. Не входит? Пофиг, что нужно реально класть по другому адресу. Выдаём ошибку. Увеличили ОЗУ. Блок входит. Но кладём в флешь по указанному адресу.
P.S.S. Секции он уложил во флешь. А саму переменную calInfo в ОЗУ!
calInfo 0x2000'0000 0x200c Data Gb main.o [1]
-
-
-
Пробовал)
В R0 читается значение, но не используется.
1 minute ago, Arlleex said:Думаю, для начала нужно разобраться, откуда накопилось 0x2838 байтов для размещения в секции, которая заведомо меньше этого размера.
Я и говорю, что в ОЗУ эта константа не должна размещаться) Она должна лежать во флешь! Но если добавить volatile, то линкер в обход правил её туда пытается запихнуть.
6 minutes ago, Arlleex said:А volatile законно указало, что оптимизировать нельзя, таблицу оставить как есть, линкер глянул на все это дело и высказал свое "фи".
Вы дописали своё сообщение. Увидел позже. Но я и не могу в этом разобраться. Я же приложил скрипт) Там явно указано, куда размещать эту огромную константу)
EXTI_STM32F103
в STM
Опубликовано · Пожаловаться
Только, если такие прерывания будут не одиночные по отношению к уже обрабатываемому прерыванию - будет потеря событий, что говорит о неверном дизайне системы. Хотя, не обязательно. Если это какая-нибудь кнопка, то дребезг, породивший N событий, не так страшен.