|
|
  |
Что за “Reserved Address” ?, фантомный код изменяет адресс |
|
|
|
Dec 27 2007, 10:54
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Есть достаточна большая программа. Вся программа работает из внешнего ОЗУ. Грузится bootloaderom из внешнего ПЗУ. Вначале программы есть модуль проверяющий корректность программы. Он подсчитывает CRC всей программы (находящуюся в ОЗУ) и сверяет с заранее установленным значением. Все переменные находятся вне прошивки, и поэтому не влияют на подсчёт. В старых версиях IAR (4…) всё работало прекрасно. Но поставил версию 5.1 и на тебе, CRC всё время не совпадает. Начал копать и выкопал что, во всей прошивке меняется один адрес (4 байта), находящийся по адресу 0x34. Посмотрел ассемблерный текст, а по этому адресу такая строка: Цитата DCD 0 ; Reserved Address Я нигде в программе не использую этот адрес. В настройках линкера никаких checksum не задействовано. Пытался найти, что за зараза туда лезет в дебагере, но ничего не вышло. Приходится пропускать большие аппаратно зависимые участки кода, а в месте программы, где в железе уже есть изменения этого адреса, в дебагере нет изменений. Господа, какие будут мысли?
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Dec 27 2007, 13:26
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Цитата но посколько это ни на что не влияло Да в моём случае это влияет на подсчёт CRC. Прикол в том, что если я по этому адрессу размещу данные, то они затираются!
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Dec 28 2007, 16:02
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
/*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x0; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x44; define symbol __ICFEDIT_region_ROM_end__ = 0xFFFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x100000; define symbol __ICFEDIT_region_RAM_end__ = 0x900000; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x1000; define symbol __ICFEDIT_size_svcstack__ = 0x100; define symbol __ICFEDIT_size_irqstack__ = 0x400; define symbol __ICFEDIT_size_fiqstack__ = 0x400; define symbol __ICFEDIT_size_undstack__ = 0x100; define symbol __ICFEDIT_size_abtstack__ = 0x100; define symbol __ICFEDIT_size_heap__ = 0x8000; /**** 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 SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite }; do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, block UND_STACK, block ABT_STACK, block HEAP} ;
Ну я мог бы ещё предположить, что это пользовательский код (т.е. мой) изменяет этот адрес. Но я никогда не пользовался этим адресом. Насторожило и то, что по этому адресу, IAR-овский коментарий "Reservid adres".
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Dec 29 2007, 11:02
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(KRS @ Dec 29 2007, 13:09)  Только адрес у него, не 0x34, а 0x14 Ну да, вы правы. Вектор действительно 0x14. По нему команда ldr pc,[pc,#24], а по адресу 0x34 собственно адрес функции-обработчика. Так IAR-вский стартап устроен. Я как раз это и подразумевал - не думал, что надо разжевывать очевидное.
|
|
|
|
|
Dec 29 2007, 14:02
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(VladislavS @ Dec 29 2007, 14:02)  Ну да, вы правы. Вектор действительно 0x14. По нему команда ldr pc,[pc,#24], а по адресу 0x34 собственно адрес функции-обработчика. Так IAR-вский стартап устроен. Как раз в IAR стартапе, этот адрес пропущен! что видно в исходниках от 5.xx Код SECTION .intvec:CODE:NOROOT(2)
PUBLIC __vector PUBLIC __vector_0x14 PUBLIC __iar_program_start EXTERN Undefined_Handler EXTERN SWI_Handler EXTERN Prefetch_Handler EXTERN Abort_Handler EXTERN IRQ_Handler EXTERN FIQ_Handler
ARM __vector: ; All default exception handlers (except reset) are ; defined as weak symbol definitions. ; If a handler is defined by the application it will take precedence. LDR PC,Reset_Addr ; Reset LDR PC,Undefined_Addr ; Undefined instructions LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) LDR PC,Prefetch_Addr ; Prefetch abort LDR PC,Abort_Addr ; Data abort __vector_0x14: DCD 0 ; RESERVED LDR PC,IRQ_Addr ; IRQ LDR PC,FIQ_Addr ; FIQ
Reset_Addr: DCD __iar_program_start Undefined_Addr: DCD Undefined_Handler SWI_Addr: DCD SWI_Handler Prefetch_Addr: DCD Prefetch_Handler Abort_Addr: DCD Abort_Handler IRQ_Addr: DCD IRQ_Handler FIQ_Addr: DCD FIQ_Handler
|
|
|
|
|
Dec 30 2007, 16:26
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(KRS @ Dec 29 2007, 17:02)  Как раз в IAR стартапе, этот адрес пропущен! что видно в исходниках от 5.xx Чего? Кто пропущен? А по какому адресу в вашем примере будет IRQ_Addr: DCD IRQ_Handler ? В примерах из состава IAR 5.11 этих стартапов больше сотни. Все немного разные. Вы какой-то нетипичный нашли. Вот другой пример: Код SECTION .intvec:CODE:NOROOT(2) PUBLIC __vector PUBLIC __iar_program_start EXTERN AT91F_IRQ_HANDLER
ARM __vector: ldr pc,[pc,#+24] ;; Reset __und_handler: ldr pc,[pc,#+24] ;; Undefined instructions __swi_handler: ldr pc,[pc,#+24] ;; Software interrupt (SWI/SVC) __prefetch_handler: ldr pc,[pc,#+24] ;; Prefetch abort __data_handler: ldr pc,[pc,#+24] ;; Data abort DC32 0xFFFFFFFF ;; RESERVED __irq_handler: ldr pc,[pc,#+24] ;; IRQ __fiq_handler: ldr pc,[pc,#+24] ;; FIQ
DC32 __iar_program_start DC32 __und_handler DC32 __swi_handler DC32 __prefetch_handler DC32 __data_handler B . DC32 AT91F_IRQ_HANDLER DC32 __fiq_handler
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|