16.11.2015, 13:59
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,406
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
После определенного количества используемых переменных - на дисплее "крякозяблики"
Добрый день,
делаю себе мультимедиа устройство для автомобиля. для вывода информации на LCD дисплей использую свою функцию WriteConst1(x,y,z). по сравнению с LCD_OUT это занимает меньше памяти в проце. Вот ее вид:
Код:
|
void WriteConst1(char row, char col, char ind){
char text_cons[13];
strConstCpy(text_cons,mes_txt1[ind]);
Lcd_Out(row, col, text_cons);
} |
Она использует эту функцию:
Код:
|
void strConstCpy(char *dest, const char *source) {
while(*source)
*dest++ = *source++ ;
*dest = 0 ;
} |
Перед етим - обявлено:
Код:
|
const char *Mes_txt1[] = {"OPEL kadett ", //0
" Radio ", //1
"Volume ", //2
"Subwoofer ", //3
"Bass ", //4
"Treble ", //5
"Tuning ", //6
"Frequency ", //7
"Line in ", //8
"Parameters ", //9
"Brightness ", //10
"Spkr_ball. "}; //12 symbols, mode, status |
Всего таких объявлений - три массива строк, 12 по 12 символов, 3 по 2 и 16 по 6.
Кроме того, в программе объявлено 18 bit-овых переменных и 46 char-ов.
Все работает, но настал момент, что при добавлении хотя бы одной переменной, дисплей вместо заданых строк отображает "крякозяблики". логически пологаю, что израсходовал какой-то лимит памяти, но компилятор показывает знятость DATA 46%, ROM 66.3%.
Хотелось бы разобраться, какой лимит я превысил и есть ли более правильный способ вывода строк на дисплей.
расскажите. пожалуйста, "на пальцах" или ткните носом в сцылку, кто знает, в чем проблемка.
Проц PIC16F877A, компилятор MikroC, средство проверки Proteus
|
|
|
|
16.11.2015, 14:17
|
|
Прописка
Регистрация: 19.02.2008
Адрес: г. Иркутск
Сообщений: 276
Сказал спасибо: 216
Сказали Спасибо 166 раз(а) в 78 сообщении(ях)
|
Re: После определенного количества используемых переменных - на дисплее "крякозяблики"
А если в пошаговом режиме в протеусе, отследить от куда он берет "крякозяблики". (файл .cof нужен для этого)
|
|
|
|
16.11.2015, 14:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: После определенного количества используемых переменных - на дисплее "крякозяблики"
Сообщение от -vitalik-
|
void WriteConst1(char row, char col, char ind){
char text_cons[13];
strConstCpy(text_cons,mes_txt1[ind]);
Lcd_Out(row, col, text_cons);
}
|
А что мешает сразу написать Lcd_Out(row, col, (char *) text1[ind]);
|
|
|
|
16.11.2015, 14:23
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: После определенного количества используемых переменных - на дисплее "крякозяблики"
Скорее всего вылетает за пределы массива.
strConstCpy(text_cons,mes_txt1[ind]); вызывает сомнения. Лучше вручную копировать:
while(Len--) *text1++ = *text2++;
|
|
|
|
16.11.2015, 14:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: После определенного количества используемых переменных - на дисплее "крякозяблики"
Lcd_Out на прерываниях работает ? Если на прерываниях и пользует указатель на строку. То, если возврат из Lcd_out до завершения, то в этой строке черт лысый будет так как она она расположена в стеке.
Последний раз редактировалось Boba_spb; 16.11.2015 в 14:29.
|
|
|
|
16.11.2015, 15:21
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: После определенного количества используемых переменных - на дисплее "крякозяблики"
Сообщение от -vitalik-
|
при добавлении хотя бы одной переменной, дисплей вместо заданых строк отображает "крякозяблики"
|
Нельзя так вульгарно писать для ПИКов с их страницами и банками. И никто вам толком ничего не поможет. Кроме вылета за пределы массива может быть вылет за пределы секций. Смотрите листинг и распределение памяти в первом случае и во втором.
И второе применять char лучше только к строкам. А так char неопределён по стандарту, он может быть и знаковым, и беззнаковым. Там тоже чудес наловить можно.
|
|
|
|
16.11.2015, 18:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: После определенного количества используемых переменных - на дисплее "крякозяблики"
Сообщение от Boba_spb
|
Lcd_Out на прерываниях работает ?
|
нет не использует не одного прерывания
|
|
|
Сказали "Спасибо" vavan1983
|
|
|
16.11.2015, 19:28
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,660
Сказал спасибо: 185
Сказали Спасибо 3,183 раз(а) в 2,063 сообщении(ях)
|
Re: После определенного количества используемых переменных - на дисплее "крякозяблики"
ну вот пожалуйста - высокий уровень языка и минимальный уровень понимания
__________________
кагмаподэ магмаподэ
|
|
|
|
16.11.2015, 19:41
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: После определенного количества используемых переменных - на дисплее "крякозяблики"
Вот только не надо токовать, что на АСМе было бы по другому. Тема избитая ещё со времён когда красноглазили на АСМе под PIC16F84 и даже раньше. Именно по этой причине куча знающего народа и свалила с ПИКов.
|
|
|
|
16.11.2015, 20:12
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,406
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
Re: После определенного количества используемых переменных - на дисплее "крякозяблики"
Boba_spb, это не помогло. lcd_out использует delay
Easyrider83, этим вроде занимается
Код:
|
while(*source)
*dest++ = *source++ ; |
беда только с индикацией. остальной код работает, как задумано
STM32F0, я думал, микроС сам разбирается со страницами
индюк, расскажите, где подучится. не все рождаются умными
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:28.
|
|