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

const

Участник
  • Постов

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

  • Посещение

Репутация

1 Обычный

Информация о const

  • Звание
    Участник
    Участник

Посетители профиля

982 просмотра профиля
  1. подскажите, что прописать в .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]
  2. Вы кладете в восьмое прерывание отсчитывая с нуля? То есть КС будет тут? __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
  3. И с КС прошивки вопрос решил. Считаю как jcxz - "с разрывом". Только куда ложить КС линкеру не говорю (сморю куда положил так: &__checksum). Он ее по разному ложит при изменении исходника, но это уже не проблема, как и хотел, диапазон задаю только в одном месте - на вкладке линкера Checksum.
  4. Я так и не понял, вы ее сами располагаете или линкер без указаний ее туда ложит? Мой, если без указаний, ложит сюда: .checksum const 0x800'38e8 4 0x4 Place holder __checksum похоже, что это далеко за таблицей векторов.
  5. Потратил время, разобрался. Вопрос отпал. Как понимаю, считая КС вашим способом нет разницы по какому адресу лежит подсчитанная линкером КС. Какой смысл ее помещать в таблицу векторов? Покажите как это выглядит в линкере и как передать адрес расположения размера прошивки (в прошивке) в программу, пожалуйста. И как положить КС в конец прошивки.
  6. патч у вас автоматом запускается после компиляции?
  7. 1) Как я уже писал, считаю КС от 0х0 до 0хFFFB (КС по 0хFFFС). Если не указывать где располагать КС у меня ее кидает куда попало (в диапазоне от 0х0 до 0хFFFB). Как при этом быть с программным подсчетом, пропускать тот адрес где лежит КС в алгоритме? Или считать с ним и должен в итоге получиться "ноль". Если я считаю программно КС от 0х0 до 0хFFFF (КС по 0хFFFС) "нуля" не получаю. 2) В самой таблице векторов или сразу после? Если в самой таблице, то место какого то прерывания неиспользуемого? У вас считается вся доступная флешь с таблицей прерываний (какой диапазон адресов, для примера)? При программном подсчете КС вы результат сверяете с подсчетом линкера или у вас на выходе "ноль" когда все ОК? Читал. С лету не вышло разобраться. Ваш пример почти весь понятен (мне подходит), разбираюсь пока. Понимаю, поэтому тут с вопросами.
  8. 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 учитывает это. Только не уверен, что это надежно. Понимаю, что "костыль".
  9. @Arlleex Есть такое, не обратил внимания. С "Multi-file Compilation" компилируется. Листинг тот же. Ничего не выкидывает даже когда забираю обращения к портам. При дополнительном выборе "Discard Unused Publics" - не компилируется вообще - ошибка.
  10. а как это включаеся в ИАР. Понятия не имею, что такое LTO.
  11. Если я не ошибаюсь, в С++ глобальные переменные по умолчанию static, если не указано иного (extern напр.), может в этом дело. Тогда действительно, компилятор видит, что в данной единице компиляции объект не используется и выкидывает его.
  12. вот так https://electronix.ru/forum/topic/192075-pri-maksimalnoy-optimizatsii-oshibka/?do=findComment&comment=1944224
  13. после добавления роботы с портами у вас "пустой зацикленный код" остался? Или все же не пустой цикл?
×
×
  • Создать...