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

 
 
 
Reply to this topicStart new topic
> Почему в МК некорректно работает память 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
Kolia
сообщение Dec 10 2015, 09:26
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



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


Скорее всего кокой-то буфер накладывается на данные (выходит за свои пределы).
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 11 2015, 06:27
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

Go to the top of the page
 
+Quote Post
bragol
сообщение Dec 11 2015, 13:02
Сообщение #4


Участник
*

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



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

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

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

не помогло.

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

Прикрепленное изображение


Прикрепленное изображение


Сообщение отредактировал bragol - Dec 11 2015, 13:09
Go to the top of the page
 
+Quote Post
редактор
сообщение Dec 14 2015, 09:17
Сообщение #5


Местный
***

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



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


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


Участник
*

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



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

модель памяти именно LARGE
Затирается конкретная переменная типа флоат, она не в массиве и указатели не используются в программе вообще
Go to the top of the page
 
+Quote Post
редактор
сообщение Dec 16 2015, 08:47
Сообщение #7


Местный
***

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



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

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


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


Участник
*

Группа: Участник
Сообщений: 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 Текстовая версия Сейчас: 16th April 2024 - 21:03
Рейтинг@Mail.ru


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