Перейти к содержанию

Почему в МК некорректно работает память xdata?

Микроконтроллер 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата
Программа выводит на дисплей хаотичные символы из памяти, перезаписывает некоторые другие переменные неправильными значениями


Скорее всего кокой-то буфер накладывается на данные (выходит за свои пределы).

Поделиться сообщением


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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Kolia @ Dec 10 2015, 13:26) <{POST_SNAPBACK}>
Скорее всего кокой-то буфер накладывается на данные (выходит за свои пределы).

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

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

не помогло.

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

[attachment=97461:IMG_2015...1_160326.jpg]

[attachment=97462:IMG_2015...1_160439.jpg]
Изменено пользователем bragol

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Если компилятор Keil и модель памяти LAGE, то стек располагается в XDATA. это первый возможный вариант затирания данных.
Если затирается конкретная переменная (еще и в середине массива) то вероятнее всего неверный указатель, который и портит эту ячейку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(редактор @ Dec 14 2015, 13:17) <{POST_SNAPBACK}>
Если компилятор Keil и модель памяти LAGE, то стек располагается в XDATA. это первый возможный вариант затирания данных.
Если затирается конкретная переменная (еще и в середине массива) то вероятнее всего неверный указатель, который и портит эту ячейку.

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(редактор @ Dec 16 2015, 12:47) <{POST_SNAPBACK}>
Размещение переменной? - в середине ИСПОЛЬЗУЕМОЙ области 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация