bragol 0 23 ноября, 2015 Опубликовано 23 ноября, 2015 · Жалоба Микроконтроллер 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kolia 0 10 декабря, 2015 Опубликовано 10 декабря, 2015 · Жалоба Программа выводит на дисплей хаотичные символы из памяти, перезаписывает некоторые другие переменные неправильными значениями Скорее всего кокой-то буфер накладывается на данные (выходит за свои пределы). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 11 декабря, 2015 Опубликовано 11 декабря, 2015 · Жалоба Обратите внимание на значение регистра AUXR после сброса МК. В программе нужно поправить: AUXR = 0x10; // XDATA = 1792 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bragol 0 11 декабря, 2015 Опубликовано 11 декабря, 2015 (изменено) · Жалоба Скорее всего кокой-то буфер накладывается на данные (выходит за свои пределы). это понятно, но не понятно почему это происходит, когда я в память не лезу, компилятор все делает сам и главное, как это исправить? Обратите внимание на значение регистра AUXR после сброса МК. В программе нужно поправить: AUXR = 0x10; // XDATA = 1792 не помогло. Еще есть такая закономерность, когда происходит "нахлест", то перезаписывается конкретная переменная типа флоат, которая по дефолту равно 1, причем записываются в нее те самые иероглифы, но как только я через меню переписываю ее значение, то программа начинает работать корректно Изменено 11 декабря, 2015 пользователем bragol Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 14 декабря, 2015 Опубликовано 14 декабря, 2015 · Жалоба Если компилятор Keil и модель памяти LAGE, то стек располагается в XDATA. это первый возможный вариант затирания данных. Если затирается конкретная переменная (еще и в середине массива) то вероятнее всего неверный указатель, который и портит эту ячейку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bragol 0 14 декабря, 2015 Опубликовано 14 декабря, 2015 · Жалоба Если компилятор Keil и модель памяти LAGE, то стек располагается в XDATA. это первый возможный вариант затирания данных. Если затирается конкретная переменная (еще и в середине массива) то вероятнее всего неверный указатель, который и портит эту ячейку. модель памяти именно LARGE Затирается конкретная переменная типа флоат, она не в массиве и указатели не используются в программе вообще Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 16 декабря, 2015 Опубликовано 16 декабря, 2015 · Жалоба Затирается конкретная переменная типа флоат, она не в массиве и указатели не используются в программе вообще Размещение переменной? - в середине ИСПОЛЬЗУЕМОЙ области XDATA, в конце? (определяется по МАП файлу). Затирается Периодически или однократно? После определенной функции или случайным образом? Из прерывания или из фона? В общем телепатия началась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bragol 0 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба Размещение переменной? - в середине ИСПОЛЬЗУЕМОЙ области 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться