реклама на сайте
подробности

 
 
> Почему в МК некорректно работает память xdata?
bragol
сообщение Nov 23 2015, 13:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 15-08-11
Пользователь №: 66 729



Микроконтроллер 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;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
редактор
сообщение Dec 16 2015, 08:47
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



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

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


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
bragol
сообщение Jan 11 2016, 14:33
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 15-08-11
Пользователь №: 66 729



Цитата(редактор @ 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
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th April 2024 - 14:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.0133 секунд с 7
ELECTRONIX ©2004-2016