|
|
  |
LPC2378 и исключительные ситуации, программа переодически сваливаеться в exception |
|
|
|
Oct 17 2008, 20:19
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 21-11-07
Пользователь №: 32 540

|
Всем привет, вопрос такой, в каких ситуациях контроллер переходит по адресам DAbt_Handler и Undef_Handler? особенно это наблюдается при использовании библиотечных фун-ций типа atof, sprintf ... ? С чем это может быть связанно? пробовал играть чутка с размером стеков, что то не помогает.
|
|
|
|
|
Oct 18 2008, 10:28
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(scifi @ Oct 18 2008, 11:37)  Я обычно ставлю точку останова на векторе исключения и потом в отладчике смотрю на содержимое регистров. А потом на мамнадцатый месяц эксплуатации на объекте этот самый отладчик, по вполне резонным причинам, оказался не подключенным, вообще отсутствующим, да и смотреть в него просто некому там.... Обработчики таких ситуаций надо иметь и логирование результатов. Вот у меня только что при подчистке менеджера памяти вывалился на дамп exception: Код Abort:[D] PC:0000628C Op:E7C02001 CPSR:200000DF LR:00010A00 SP:7FD003F0 SP[0]:00000010->00018874->400021B0->E01FC000-> SP[4]:00000024->0000F76C->005801C0->0000407C R0:00000000 R1:00000000 R2:000000C0 R3:00000058 R4:0000CA02 R5:40000B14 R6:00000000 R7:7FD00409 R8:00000003 R9:09090909 R10:10101010 R11:11111111 R12:000000C0 Вполне разбирабельно (на мой взгляд  ).
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 20 2008, 06:44
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 21-11-07
Пользователь №: 32 540

|
Короче намек понял, куда нужно копать, буду исследовать, на выхах так и не получилось доползти до компа, всем спасибо за ответы.
|
|
|
|
|
Oct 22 2008, 09:25
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 21-11-07
Пользователь №: 32 540

|
посмотрел как посоветовали многоуважаемые гуру что за команда дает сбой просто идет загрузка из памяти типа LDRB R0,[R0,R1] и после этого проц уходит на адрес обработки исключения. Мдяя, все происходит внутри библиотечных функций, соответсвенно для меня начинающего армовода разобраться сложновато. Вычитал тут http://www.arm.com/support/faqdev/1217.html что при использовании библиотечных функций необходимо дополнительно что то инициализировать связанное с расположением этих библиотек. Так ли это? Нашел такой пример который необходимо вставить с стартовый файл, но это не помогло. Example 2.1. __main and __rt_entry IMPORT __rt_entry EXPORT __main ENTRY __main B __rt_entry END ЗЫ Может кто посмотрит мой startup файл, елс есть время?
Сообщение отредактировал cyberrevenger - Oct 22 2008, 09:29
|
|
|
|
|
Oct 22 2008, 09:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(cyberrevenger @ Oct 22 2008, 13:25)  посмотрел как посоветовали многоуважаемые гуру что за команда дает сбой просто идет загрузка из памяти типа LDRB R0,[R0,R1] и после этого проц уходит на адрес обработки исключения. Дальше дело техники - посмотреть, что лежит в R0 и R1, и откуда оно туда приходит. Цитата(cyberrevenger @ Oct 22 2008, 13:25)  ЗЫ Может кто посмотрит мой startup файл, елс есть время? Выкладывайте, посмотрим.
|
|
|
|
|
Oct 22 2008, 09:45
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 21-11-07
Пользователь №: 32 540

|
Цитата(aaarrr @ Oct 22 2008, 13:41)  Дальше дело техники - посмотреть, что лежит в R0 и R1, и откуда оно туда приходит. мм, вот в этом то и проблема, отследить в аасемблере что откуда приходит, фу-ция то библиотечная, че они там нагородили)) Цитата(aaarrr @ Oct 22 2008, 13:41)  Выкладывайте, посмотрим. Ок, вот Код ;/***************************************************************************** ;* startup.s: startup file for NXP LPC230x Family Microprocessors ;* ;* Copyright(C) 2006, NXP Semiconductor ;* All rights reserved. ;* ;* History ;* 2006.09.01 ver 1.00 Prelimnary version, first Release ;* ;*****************************************************************************/ PRESERVE8
;/* ; * The STARTUP.S code is executed after CPU Reset. This file may be ; * translated with the following SET symbols. In uVision these SET ; * symbols are entered under Options - ASM - Define. ; * ; * REMAP: when set the startup code initializes the register MEMMAP ; * which overwrites the settings of the CPU configuration pins. The ; * startup and interrupt vectors are remapped from: ; * 0x00000000 default setting (not remapped) ; * 0x40000000 when RAM_MODE is used ; * ; * RAM_MODE: when set the device is configured for code execution ; * from on-chip RAM starting at address 0x40000000. ; */
; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
Mode_USR EQU 0x10 Mode_FIQ EQU 0x11 Mode_IRQ EQU 0x12 Mode_SVC EQU 0x13 Mode_ABT EQU 0x17 Mode_UND EQU 0x1B Mode_SYS EQU 0x1F
I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
;// <h> Stack Configuration (Stack Sizes in Bytes) ;// <o0> Undefined Mode <0x0-0xFFFFFFFF:8> ;// <o1> Supervisor Mode <0x0-0xFFFFFFFF:8> ;// <o2> Abort Mode <0x0-0xFFFFFFFF:8> ;// <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8> ;// <o4> Interrupt Mode <0x0-0xFFFFFFFF:8> ;// <o5> User/System Mode <0x0-0xFFFFFFFF:8> ;// </h>
UND_Stack_Size EQU 0x00000000 SVC_Stack_Size EQU 0x00000100 ABT_Stack_Size EQU 0x00000000 FIQ_Stack_Size EQU 0x00000100 IRQ_Stack_Size EQU 0x00000100 USR_Stack_Size EQU 0x00000200
Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \ FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)
AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size
Stack_Top EQU Stack_Mem + Stack_Size
;// <h> Heap Configuration ;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF> ;// </h>
Heap_Size EQU 0x00000300
AREA HEAP, NOINIT, READWRITE, ALIGN=3 Heap_Mem SPACE Heap_Size
; Area Definition and Entry Point ; Startup Code must be linked first at Address at which it expects to run.
AREA RESET, CODE, READONLY ARM
; Exception Vectors ; Mapped to Address 0. ; Absolute addressing mode must be used. ; Dummy Handlers are implemented as infinite loops which can be modified.
Vectors LDR PC, Reset_Addr LDR PC, Undef_Addr LDR PC, SWI_Addr LDR PC, PAbt_Addr LDR PC, DAbt_Addr NOP ; Reserved Vector ; LDR PC, IRQ_Addr LDR PC, [PC, #-0x0120] ; Vector from VicVectAddr LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler Undef_Addr DCD Undef_Handler SWI_Addr DCD SWI_Handler PAbt_Addr DCD PAbt_Handler DAbt_Addr DCD DAbt_Handler DCD 0xB9206E28 ; Reserved Address IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler
Undef_Handler B Undef_Handler SWI_Handler B SWI_Handler PAbt_Handler B PAbt_Handler DAbt_Handler B DAbt_Handler IRQ_Handler B IRQ_Handler FIQ_Handler B FIQ_Handler
; Reset Handler
EXPORT Reset_Handler Reset_Handler
; Setup Stack for each mode LDR R0, =Stack_Top
; Enter Undefined Instruction Mode and set its Stack Pointer MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #UND_Stack_Size
; Enter Abort Mode and set its Stack Pointer MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #ABT_Stack_Size
; Enter FIQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #FIQ_Stack_Size
; Enter IRQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #IRQ_Stack_Size
; Enter Supervisor Mode and set its Stack Pointer MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #SVC_Stack_Size
; Enter User Mode and set its Stack Pointer MSR CPSR_c, #Mode_USR MOV SP, R0 SUB SL, SP, #USR_Stack_Size IMPORT TargetResetInit BL TargetResetInit
; Enter the C code
; IMPORT __main ; LDR R0, =__main ; BX R0 IMPORT __rt_entry EXPORT __main ENTRY __main B __rt_entry
; User Initial Stack & Heap AREA |.text|, CODE, READONLY
IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap
LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + USR_Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR
END
|
|
|
|
|
Oct 22 2008, 19:18
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 21-11-07
Пользователь №: 32 540

|
Цитата(aaarrr @ Oct 22 2008, 20:57)  Со стартапом все в порядке, только переход на __main назад верните, а то у Вас потом scatter отвалится. Пока я ковыряюсь в асме, не могли бы вы привести пример использования либо atof() либо sprintf() с декларированием буфера в котором будет строка, и с вызовом функции, может я не так что то делаю. Если не сложно.
|
|
|
|
|
Oct 23 2008, 19:37
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 21-11-07
Пользователь №: 32 540

|
Странно как то, пересоздал заново проект, запихнул туда исходники и перекомпилил, залил на плату и все заработало)) т.е. библиотечные фун-ции вызываються и отрабатывают без исключений.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|