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

    

Почему в МК некорректно работает память 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

 

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


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

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

 

Обратите внимание на значение регистра AUXR после сброса МК. В программе нужно поправить:

AUXR = 0x10; // XDATA = 1792

не помогло.

 

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

 

post-66729-1449839300_thumb.jpg

 

post-66729-1449839310_thumb.jpg

Изменено пользователем bragol

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


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

Если компилятор Keil и модель памяти LAGE, то стек располагается в XDATA. это первый возможный вариант затирания данных.

Если затирается конкретная переменная (еще и в середине массива) то вероятнее всего неверный указатель, который и портит эту ячейку.

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


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

Если затирается конкретная переменная (еще и в середине массива) то вероятнее всего неверный указатель, который и портит эту ячейку.

модель памяти именно LARGE

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

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


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

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

Затирается Периодически или однократно? После определенной функции или случайным образом? Из прерывания или из фона?

В общем телепатия началась.

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


Ссылка на сообщение
Поделиться на другие сайты
Размещение переменной? - в середине ИСПОЛЬЗУЕМОЙ области 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

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


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

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

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

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

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

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

Войти

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

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