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

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...