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

 
 
> Доступ к элементам структуры -> HardFault_Handler, При попытке прочитать элемент попадаю в HardFault_Handler
Arischenko Ivan
сообщение Aug 11 2012, 07:46
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768



Коллеги,
Дано: IAR for ARM, 6.30.1342

Есть структура :
typedef struct
{
uint16_t Zone;
uint16_t Block;
uint16_t Page;
} NAND_ADDRESS;

создаю элемент типа этой структуры :
NAND_ADDRESS WriteReadAddr;

При попытке прочитать элемент WriteReadAddr.Zone попадаю в HardFault.
Я сделал workaround, чтобы обойти эту проблему, поменял тип элементов структуры поменял тип uint16_t на uint32_t.
typedef struct
{
uint32_t Zone;
uint32_t Block;
uint32_t Page;
} NAND_ADDRESS;

Но это не решение, просто я закопал проблему глубже.

Помоги разобраться, в чем корень проблемы?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
scifi
сообщение Aug 11 2012, 07:53
Сообщение #2


Гуру
******

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



Уточняющие вопросы:
- какой процессор?
- "NAND_ADDRESS WriteReadAddr;" - это что? Локальная или глобальная переменная? Или вообще размещается во внешней памяти?
Go to the top of the page
 
+Quote Post
Arischenko Ivan
сообщение Aug 11 2012, 08:29
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768



stm32f4xx, переменная во внутренней sram, глобальная.

Entry Address Size Type Object
WriteReadAddr 0x20000814 0xc Data Gb main.o [1]

Сообщение отредактировал Arischenko Ivan - Aug 11 2012, 08:30
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 11 2012, 08:48
Сообщение #4


Гуру
******

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



Странно это. Ничто не предвещает Hard Fault. Будет интересно, если посмотрите, какая именно инструкция вызывает Hard Fault, и каковы значения регистров перед этим.
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Aug 11 2012, 09:21
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Какой именно fault? Что в CFSR и HFSR ?
Сразу напрашивается не выравненный доступ. Попробуйте
Код
typedef union
{
   struct {
       uint16_t Zone;
       uint16_t Block;
       uint16_t Page;
} data;
  uint32_t dummy;
} NAND_ADDRESS;


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
Arischenko Ivan
сообщение Aug 11 2012, 10:10
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768



CFSR = 0x00010000, UNDEFINSTR = 1

UNDEFINSTR: Undefined instruction Usage Fault:
0 = no undefined instruction
1 = the processor has attempted to execute an undefined instruction. When this bit is set, the PC value
stacked for the exception return points to the undefined instruction. An undefined instruction is an
instruction that the processor cannot decode. Potential reasons:
a) Use of instructions not supported in the Cortex-M device.
cool.gif Bad or corrupted memory contents.

HFSR =0x40000000, FORSED = 1

The HFSR has bit 30 set indicating that the Usage Fault
was escalated to a Hard Fault (displayed as the FORCED
bit). This is consistent with the debugger source window
that shows the PC at the Hard Fault handler address.

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 11 2012, 18:45
Сообщение #7


Гуру
******

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



Может быть, у вас не STM32F4xx, а STM32F2xx? Тогда UXTAH будет undefined instruction, если не ошибаюсь.

Update:
Чтобы установить, какой там процессор, можно проверить регистр CPUID.
Go to the top of the page
 
+Quote Post
Arischenko Ivan
сообщение Aug 12 2012, 20:05
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768



Цитата(scifi @ Aug 11 2012, 22:45) *
Может быть, у вас не STM32F4xx, а STM32F2xx? Тогда UXTAH будет undefined instruction, если не ошибаюсь.


#$#$!! В точку!
scifi, Большое спасибо.

В общем дело в чем : на столе у меня лежат две одинаковые платы и я считал что работаю с 417 процессором. С одной работаю, на второй смотрю процессор, разводку, думаю. В общем оказалось что я работал действительно с 217, думая что работаю с 417, держа в руках вторую плату с 417!.
Ведь IAR мне в консоли честно писал Cortex M3;
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 13:16
Рейтинг@Mail.ru


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