Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ARM9 - Проблема с переменными
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
fademike
Наткнулся на очень нелепую проблемку: Каким-то образом изменение одних переменных меняют другие переменные. Не понимаю, как такое возможно!?

Код
unsigned char Block_Files[512];
unsigned char File[32];

int main (void) {                       // Main Program                      

unsigned int clock;
unsigned long Peremennaja[512];        // Создадим ненужную переменную
    
Config_GPIO ();

TFT_LCD_Init();

TFT_LCD_BGcolor(0xFF0000);
TFT_LCD_ConSetColor(0x000000, 0xFFFFFF);
TFT_LCD_ConSetPos(0,0);


SDcard_init();
Show_Folder(Block_Files, File);

    for (clock=0; clock<512; clock++) Peremennaja[clock] = 0x00;     // Передаем ненужной переменной, например, нули

for (clock=0; clock<512; clock++){
    Delay(50);
TFT_LCD_Char  (Block_Files[clock]);    // Выведенные символы из-за "Peremennaja" Стали черными квадратиками
}

while(1){};
}



Функции: "TFT_LCD_ConSetColor(0x000000, 0xFFFFFF); и TFT_LCD_ConSetPos(0,0);" просто записывают цвет, строку и столбец в переменные "unsigned int".

Без записи в переменную "Peremennaja[512]" все работает. А когда в нее записываем значения, то эти значения вносятся в переменные указателя цвета и курсора...


Подскажите, плиз, в чем секрет??
aaarrr
А стека достаточно для двухкилобайтного массива?
fademike
Цитата(aaarrr @ Mar 10 2013, 18:07) *
А стека достаточно для двухкилобайтного массива?


Микроконтроллер: AT91SAM9G45. Кажись, должно хватать! Keil не жалуется!
_Артём_
Цитата(fademike @ Mar 10 2013, 16:19) *
Кажись, должно хватать!

Если выделить, то должно.

Цитата(fademike @ Mar 10 2013, 16:19) *
Keil не жалуется!

Как он должен жаловаться?
Попробуйте для интереса объявить массив Peremennaja килобайт на 100.
fademike
Цитата(_Артём_ @ Mar 10 2013, 18:26) *
Если выделить, то должно.


Как он должен жаловаться?
Попробуйте для интереса объявить массив Peremennaja килобайт на 100.


Как я понимаю, я выделил: В keil-е size: 0x8000 - это 32 кБ - Должно хватать..
aaarrr
Вот выдержка из map-файла:
Цитата
Base Addr Size Type Attr Idx E Section Name Object

0x00300000 0x00002960 Data RW 12 .data lcd_driver.o
0x00302960 0x00000220 Zero RW 35 .bss main.o
0x00302b80 0x00000060 Zero RW 140 .bss c_5.l(libspace.o)
0x00302be0 0x00000000 Zero RW 2 HEAP sam9g45.o
0x00302be0 0x000000c8 Zero RW 1 STACK sam9g45.o


Что будет, когда стек наползет на main.o(.bss), думаю, должно быть понятно.
fademike
Цитата(aaarrr @ Mar 10 2013, 18:45) *
Что будет, когда стек наползет на main.o(.bss), думаю, должно быть понятно.


Значит, мне нужно подключать внешнее ОЗУ??
aaarrr
Цитата(fademike @ Mar 10 2013, 18:50) *
Значит, мне нужно подключать внешнее ОЗУ??

Вообще, конечно нужно: 64кБайт - это очень мало в масштабах подобного процессора.
Но к расширению стека это отношения не имеет, он у вас жестко задан в SAM9G45.s
_Артём_
Цитата(fademike @ Mar 10 2013, 16:50) *
Значит, мне нужно подключать внешнее ОЗУ??

Интересный вывод...может АРМ взять помощней...


Стек выделите побольше.
fademike
Объем стека это там - ISR_Stack_Size??
aaarrr
Цитата(fademike @ Mar 10 2013, 19:15) *
Объем стека это там - ISR_Stack_Size??

Это один из стеков (для прерываний). Вашей программе достается USR_Stack_Size.
fademike
И, если не сложно, подскажите мне, пожалуйста, литературу!

Увеличил уже до "USR_Stack_Size EQU 0x00000140" А программе ни по чем..
При дальнейшем увеличении - ошибка((
_Артём_
Цитата(fademike @ Mar 10 2013, 17:30) *
И, если не сложно, подскажите мне, пожалуйста, литературу!

sam9g

Цитата(fademike @ Mar 10 2013, 17:30) *
Увеличил уже до "USR_Stack_Size EQU 0x00000140" А программе ни по чем..

Маловато будет:
0x140 = 320

Цитата(fademike @ Mar 10 2013, 17:30) *
При дальнейшем увеличении - ошибка((

Нет ошибки, ставил 0x1000
Fedor
А сколько ОЗУ на плате?
aaarrr
Цитата(fademike @ Mar 10 2013, 19:30) *
И, если не сложно, подскажите мне, пожалуйста, литературу!

Достаточный набор:
ARM926EJ-S Technical Reference Manual
Datasheet на процессор
Хелп компилятора
Но все это нужно честно изучать.

Цитата(fademike @ Mar 10 2013, 19:30) *
Увеличил уже до "USR_Stack_Size EQU 0x00000140" А программе ни по чем..
При дальнейшем увеличении - ошибка((

0x140 = 320 байт, а нужно много больше. Какая ошибка?
fademike
Цитата(Fedor @ Mar 10 2013, 19:41) *
А сколько ОЗУ на плате?


DDR2 - 512 Мбит. И как я понял в файле SAM9G45.s уже инициализация прописана..

Цитата(aaarrr @ Mar 10 2013, 19:43) *
0x140 = 320 байт, а нужно много больше. Какая ошибка?


когда 0x1000:

BOOT.axf: Error: L6406E: No space in execution regions with .ANY selector matching sam9g45.o(STACK).
BOOT.axf: Error: L6407E: Sections of aggregate size 0x1088 bytes could not fit into .ANY selector(s).

Как я понял "0x1088" - это объем всего стека, что равно 4'232 Байтам. И это максимальный объем хранимых переменных, чтоли??
aaarrr
У вас сейчас всего в распоряжении 64кБайта внутренней SRAM.
В скаттере прописан явный бред: код расположен на месте ROM, загрузить его туда нельзя.

0x1088 байт должно было поместиться. Приведите map-файл для случая, когда выдается ошибка.
fademike
Цитата(aaarrr @ Mar 10 2013, 20:26) *
У вас сейчас всего в распоряжении 64кБайта внутренней SRAM.
В скаттере прописан явный бред: код расположен на месте ROM, загрузить его туда нельзя.

0x1088 байт должно было поместиться. Приведите map-файл для случая, когда выдается ошибка.


aaarrr, прошу прощения, у меня в "Target" размер был 0x3000. Поэтому и выдавал ошибку..

Не могли бы мне объяснить что такое скаттер и как читать map-файл??
aaarrr
Цитата(fademike @ Mar 10 2013, 20:32) *
Не могли бы мне объяснить что такое скаттер и как читать map-файл??

Scatter - файл с описанием карт памяти и размещения секций для линкера. Формат должен быть описан в справке Кейла.
Для очень простых проектов можно генерировать этот файл средствами IDE, но лучше и правильнее составить его вручную.

Как читать map-файл должно стать понятно после изучения справки по линкеру, ибо это просто его выхлоп.
fademike
Огромное спасибо за помощь!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.