реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LPC2378 и исключительные ситуации, программа переодически сваливаеться в exception
cyberrevenger
сообщение Oct 17 2008, 20:19
Сообщение #1


Участник
*

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



Всем привет, вопрос такой, в каких ситуациях контроллер переходит по адресам DAbt_Handler и Undef_Handler? особенно это наблюдается при использовании библиотечных фун-ций типа atof, sprintf ... ?
С чем это может быть связанно? пробовал играть чутка с размером стеков, что то не помогает.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2008, 20:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Сначала разберитесь, какая именно инструкция при каких условиях вызывает этот abort. Например, так.
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 18 2008, 09:37
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(aaarrr @ Oct 18 2008, 00:55) *
Сначала разберитесь, какая именно инструкция при каких условиях вызывает этот abort. Например, так.

Я обычно ставлю точку останова на векторе исключения и потом в отладчике смотрю на содержимое регистров.
А вообще полностью согласен: вместо того, чтобы пританцовывать с бубном (размер стека и т.д.), нужно просто найти первопричину, благо средства отладки это позволяют.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 18 2008, 10:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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

Вполне разбирабельно (на мой взгляд smile.gif ).


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
cyberrevenger
сообщение Oct 20 2008, 06:44
Сообщение #5


Участник
*

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



Короче намек понял, куда нужно копать, буду исследовать, на выхах так и не получилось доползти до компа, всем спасибо за ответы.
Go to the top of the page
 
+Quote Post
cyberrevenger
сообщение Oct 22 2008, 09:25
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 22 2008, 09:41
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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 файл, елс есть время?

Выкладывайте, посмотрим.
Go to the top of the page
 
+Quote Post
cyberrevenger
сообщение Oct 22 2008, 09:45
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 22 2008, 09:49
Сообщение #9


Гуру
******

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



Цитата(cyberrevenger @ Oct 22 2008, 11:25) *
Вычитал...

Не фантазируйте - в библиотеках это нормально - вызовы memcpy() и подобных с неверными указателями обычное дело. Смотрите LR, смотрите стек, ищите кто вызвал....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 22 2008, 16:57
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(cyberrevenger @ Oct 22 2008, 13:45) *
Ок, вот

Со стартапом все в порядке, только переход на __main назад верните, а то у Вас потом scatter отвалится.
Go to the top of the page
 
+Quote Post
cyberrevenger
сообщение Oct 22 2008, 19:18
Сообщение #11


Участник
*

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



Цитата(aaarrr @ Oct 22 2008, 20:57) *
Со стартапом все в порядке, только переход на __main назад верните, а то у Вас потом scatter отвалится.


Пока я ковыряюсь в асме, не могли бы вы привести пример использования либо atof() либо sprintf() с декларированием буфера в котором будет строка, и с вызовом функции, может я не так что то делаю. Если не сложно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 23 2008, 07:35
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Там трудно что-то не так делать.

Код
char str[20];

int main(void)
{
    snprintf(str, sizeof(str), "%d\n", 12345);
    ...
}
Go to the top of the page
 
+Quote Post
cyberrevenger
сообщение Oct 23 2008, 19:37
Сообщение #13


Участник
*

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



Странно как то, пересоздал заново проект, запихнул туда исходники и перекомпилил, залил на плату и все заработало)) т.е. библиотечные фун-ции вызываються и отрабатывают без исключений.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 05:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01562 секунд с 7
ELECTRONIX ©2004-2016