Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Почему в МК некорректно работает память xdata?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
bragol
Микроконтроллер AD89C51RD2, 64 КБ встроенной памяти, 1792 Б XRAM. Есть к нему прошивка в несколько тысяч строк, вот ее габариты: "Program Size: data=76.5 xdata=820 code=38246". Проблема возникает именно с областью памяти xdata.
В программе есть переменные, которые я записываю в эту область памяти типа:
float xdata ppk2K72 = 0.9843;
float xdata ppk2K73 = 0.99698;
float xdata ppk2K61 = 0.99596;
float xdata ppk2K62 = 0.99849;

Таких переменных больше 100 и их обязательно надо хранить в памяти.
Так вот пока эти переменные были закоментированны и не забивали память, программа работала корректно, но как только пришло время их использовать, я перепрошил свое устройство, то появились явные глюки, связанные с переполнением памяти. Программа выводит на дисплей хаотичные символы из памяти, перезаписывает некоторые другие переменные неправильными значениями... Глюк пропадает, когда я освобождаю область памяти XDATA, который у меня настроен на максимальный объем памяти:
void initialization()
{
EA = 1; // enable interrupts
CKRL = 0xFF; //Clock Reload Register for calculating core frequency
CKCON0 = 0x01; // X2 mode for all peripherals
CKCON1 = 0x00; // X2 for SPI
AUXR |= 0x10; // XDATA = 1792
IPH0 = 0x00; // низкий уровень прерываний для всей переферии
IPL0 = 0x00;
//********** UART Mode 1 (8 bit) with int_BRD
PCON |= 0x80; // SMOD1 = 1
SCON = 0x50; // uart in mode 1 (8 bit), REN=1
BDRCON &= ~0xEC; // BRR=0; SRC=0;
BDRCON |= 0x0E; // TBCK=1;RBCK=1; SPD=1
BRL = 0xB8; // 9600 Bds at 11.092MHz
ES = 1; // Enable serial interrupt
BDRCON |= 0x10; // Baud rate generator run

TI = 0;
RI = 0;
}
Kolia
Цитата
Программа выводит на дисплей хаотичные символы из памяти, перезаписывает некоторые другие переменные неправильными значениями


Скорее всего кокой-то буфер накладывается на данные (выходит за свои пределы).
Палыч
Обратите внимание на значение регистра AUXR после сброса МК. В программе нужно поправить:
Код
AUXR = 0x10; // XDATA = 1792

bragol
Цитата(Kolia @ Dec 10 2015, 13:26) *
Скорее всего кокой-то буфер накладывается на данные (выходит за свои пределы).

это понятно, но не понятно почему это происходит, когда я в память не лезу, компилятор все делает сам и главное, как это исправить?

Цитата(Палыч @ Dec 11 2015, 10:27) *
Обратите внимание на значение регистра AUXR после сброса МК. В программе нужно поправить:
Код
AUXR = 0x10; // XDATA = 1792

не помогло.

Еще есть такая закономерность, когда происходит "нахлест", то перезаписывается конкретная переменная типа флоат, которая по дефолту равно 1, причем записываются в нее те самые иероглифы, но как только я через меню переписываю ее значение, то программа начинает работать корректно

Нажмите для просмотра прикрепленного файла

Нажмите для просмотра прикрепленного файла
редактор
Если компилятор Keil и модель памяти LAGE, то стек располагается в XDATA. это первый возможный вариант затирания данных.
Если затирается конкретная переменная (еще и в середине массива) то вероятнее всего неверный указатель, который и портит эту ячейку.
bragol
Цитата(редактор @ Dec 14 2015, 13:17) *
Если компилятор Keil и модель памяти LAGE, то стек располагается в XDATA. это первый возможный вариант затирания данных.
Если затирается конкретная переменная (еще и в середине массива) то вероятнее всего неверный указатель, который и портит эту ячейку.

модель памяти именно LARGE
Затирается конкретная переменная типа флоат, она не в массиве и указатели не используются в программе вообще
редактор
Цитата
Затирается конкретная переменная типа флоат, она не в массиве и указатели не используются в программе вообще

Размещение переменной? - в середине ИСПОЛЬЗУЕМОЙ области XDATA, в конце? (определяется по МАП файлу).
Затирается Периодически или однократно? После определенной функции или случайным образом? Из прерывания или из фона?
В общем телепатия началась.
bragol
Цитата(редактор @ Dec 16 2015, 12:47) *
Размещение переменной? - в середине ИСПОЛЬЗУЕМОЙ области XDATA, в конце? (определяется по МАП файлу).
Затирается Периодически или однократно? После определенной функции или случайным образом? Из прерывания или из фона?
В общем телепатия началась.

Вот расположение этой переменной:
Код
X:031AH         PUBLIC        pCompareFl

она формируется из массива, который в дальнейшем объединяется в переменную типа флоат
Код
X:02D3H         PUBLIC        pCompare


Код
* * * * * * *  X D A T A   M E M O R Y  * * * * * * *
            XDATA   0000H     027FH     UNIT         _XDATA_GROUP_
            XDATA   027FH     00AFH     UNIT         ?XD?MAIN
            XDATA   032EH     000BH     UNIT         ?XD?ALPHABETLCD

нас интересует область MAIN
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.