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

 
 
> Работа с кучей
athlon64
сообщение Mar 12 2012, 10:26
Сообщение #1


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Процессор AT91sam7x512, IAR 6.30
В проекте использую динамическую память. Пробовал использовать библиотечные функции (malloc, free) и менеджер памяти BGET.
Суть проблемы в том, что контроллер периодически (~раз в час уходит в Abort Handler). Адрес в регистре LR указывает на инструкции, выполняющие строку
Код
b->bh.bsize += bn->bh.bsize;
библиотеки BGET (процедура brel).
По состоянию переменных также понятно, что затык происходит при попытке освободить память (указатель, передающийся процедуре brel корректный, по нему лежат данные верного куска памяти).
Куда копать?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Mar 20 2012, 17:16
Сообщение #2


Гуру
******

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



Если процессор находится в привилегированном режиме, то корректно. Только лучше intrinsic'и использовать, а не вставки.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Mar 21 2012, 01:49
Сообщение #3


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(aaarrr @ Mar 20 2012, 23:16) *
Если процессор находится в привилегированном режиме, то корректно. Только лучше intrinsic'и использовать, а не вставки.

Ну эти вставки и взяты из дизассемблера яровских intrinsic (__enable interrupt, __disable interrupt).

Могу добавив в cstartup следующего кода перевести процессор в режим SYSTEM? Чем чревато постоянное нахождение в SYSTEM-режиме?
Код
mrs     r0,cpsr                        ; Original PSR value
bic     r0,r0,#MODE_BITS                  ; Clear the mode bits
orr     r0,r0,#SYS_MODE                ; Set System mode
msr     cpsr_c,r0                         ; Change the mode


Хотелось бы найти способ отключения обработки всех прерываний, не привязанный к IAR, при этом не задержав обработку прерываний на время более чем время нахождени в malloc/free. Или лучше отключать/включать прерывания от всей периферии по отдельности?
Не приведёт ли манипуляция с I-битом к негативным последствиям при попытке снять I-бит в обработчике прерывания?

Сообщение отредактировал athlon64 - Mar 21 2012, 02:14


--------------------
Руслан
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 14th August 2025 - 02:48
Рейтинг@Mail.ru


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