const
Участник-
Постов
65 -
Зарегистрирован
-
Посещение
Репутация
1 ОбычныйИнформация о const
-
Звание
Участник
Посетители профиля
982 просмотра профиля
-
подскажите, что прописать в .icf я пробую так place at address mem:__ICFEDIT_region_FLASH_start__+0x20 { readonly section .checksum }; выдает ошибку Error[Lp015]: section placement failure: overcommitted content in [0x800'0000-0x800'001f]
-
Вы кладете в восьмое прерывание отсчитывая с нуля? То есть КС будет тут? __vector_table DCD sfe(CSTACK) DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved /* ТУТ */ DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler
-
И с КС прошивки вопрос решил. Считаю как jcxz - "с разрывом". Только куда ложить КС линкеру не говорю (сморю куда положил так: &__checksum). Он ее по разному ложит при изменении исходника, но это уже не проблема, как и хотел, диапазон задаю только в одном месте - на вкладке линкера Checksum.
-
Я так и не понял, вы ее сами располагаете или линкер без указаний ее туда ложит? Мой, если без указаний, ложит сюда: .checksum const 0x800'38e8 4 0x4 Place holder __checksum похоже, что это далеко за таблицей векторов.
-
Потратил время, разобрался. Вопрос отпал. Как понимаю, считая КС вашим способом нет разницы по какому адресу лежит подсчитанная линкером КС. Какой смысл ее помещать в таблицу векторов? Покажите как это выглядит в линкере и как передать адрес расположения размера прошивки (в прошивке) в программу, пожалуйста. И как положить КС в конец прошивки.
-
патч у вас автоматом запускается после компиляции?
-
1) Как я уже писал, считаю КС от 0х0 до 0хFFFB (КС по 0хFFFС). Если не указывать где располагать КС у меня ее кидает куда попало (в диапазоне от 0х0 до 0хFFFB). Как при этом быть с программным подсчетом, пропускать тот адрес где лежит КС в алгоритме? Или считать с ним и должен в итоге получиться "ноль". Если я считаю программно КС от 0х0 до 0хFFFF (КС по 0хFFFС) "нуля" не получаю. 2) В самой таблице векторов или сразу после? Если в самой таблице, то место какого то прерывания неиспользуемого? У вас считается вся доступная флешь с таблицей прерываний (какой диапазон адресов, для примера)? При программном подсчете КС вы результат сверяете с подсчетом линкера или у вас на выходе "ноль" когда все ОК? Читал. С лету не вышло разобраться. Ваш пример почти весь понятен (мне подходит), разбираюсь пока. Понимаю, поэтому тут с вопросами.
-
IAR 9.50.1.69506 Приветствую. Помогите разобраться. 1. Вопрос первый а) Считаю КС способом как на скрине. б) В линкере есть такие строки для размещения КС по определенному адресу: define symbol __addr_calc_cs_end__ = 0x0800FFFB; place at address mem:__addr_calc_cs_end__ +1 { readonly section .checksum }; в) В исходнике используя константы линкера __checksum_begin, __checksum_end, __checksum счтитаю и сверяю КС (в файле .icf они не видны). Могу ли я "расширить область видимости" __checksum_end для файла линкера .icf, что бы адресс 0x0800FFFB не прописывать два раза (во вкладке Checksum и файле .icf)? 2. Вопрос второй Можно ли передать глобальную константу в inline asm, что бы вместо MOV R0, #0x20000000 было MOV R0, RAM_START? asm ( "MOV R0, #0x20000000 \n" "ADD R4, R0, #0x4000 \n" "ADD R0, R0, #0x000C \n" ... сейчас делаю это так: void r0_r1_r2(int r0, int r1, int r2) { asm ("nop"); }, после вызова ф-ции значения ее входных параметров оказываются в соответствующих регистрах, а потом уже мой inline asm учитывает это. Только не уверен, что это надежно. Понимаю, что "костыль".
-
@Arlleex Есть такое, не обратил внимания. С "Multi-file Compilation" компилируется. Листинг тот же. Ничего не выкидывает даже когда забираю обращения к портам. При дополнительном выборе "Discard Unused Publics" - не компилируется вообще - ошибка.
-
а как это включаеся в ИАР. Понятия не имею, что такое LTO.
-
Если я не ошибаюсь, в С++ глобальные переменные по умолчанию static, если не указано иного (extern напр.), может в этом дело. Тогда действительно, компилятор видит, что в данной единице компиляции объект не используется и выкидывает его.
-
вот так https://electronix.ru/forum/topic/192075-pri-maksimalnoy-optimizatsii-oshibka/?do=findComment&comment=1944224
-
после добавления роботы с портами у вас "пустой зацикленный код" остался? Или все же не пустой цикл?