Здравствуйте.
Контроллер С8051F022, внешная RAM (xdata), по UART подключен термопринтер (по сути обычный терминал, только вывод на бумагу). Среда разработки KEIL 4.02, BL51.exe v6.22.
В проекте после инициализации и перед основным функционалом вызывается функция теста внешней RAM памяти. Сама функция работает, на выходе получаем номер закороченного или не присоединенного вывода. Теперь надо его вывести на термопринтер. Используется для этого printf(). Дальше, уж извините за большое количество букв, опишу все по порядку.
1) В проекте только тест железа, переменные по умолчанию в data (Small memory model в настройках проекта). Все работает. Используется ТОЛЬКО внешняя xdata, встроенная в МК не задействована.
2) Проект растет, small memory model уже мало, ставлю large(variables in xdata). До этого критичные для работы переменные в функции теста внешней RAM принудительно располагаются в data. На выходе функции теста внешней RAM получаю верный ответ, а вот принтер печатает кракозябры. Предполагаемая причина -- внутренние переменные printf() располагаются в битой памяти (внешняя микросхема RAM (xdata)). Переключил режим на совместное использование встроенной в МК xdata (адреса с 0х0000 до 0х0FFF) и внешней микросхемы RAM xdata (адреса с 0х1000 и выше). После этого все заработало.
3) Проект растет не по дням а по часам, внешняя RAM поставлена не для солидности. Объявляется большой массив в xdata. Печать опять кракозябрами.
file.m51
TYPE BASE LENGTH RELOCATION SEGMENT NAME
--------------------------------------------------------------------
XDATA 8053H 0030H UNIT ?XD?PRINTF?PRINTF
XDATA 81FFH 0001H UNIT ?XD?_PUTCHAR?PUTCHAR
А теперь собственно вопрос: как указать линкеру область памяти, в которой он может размещать переменные указанных выше функций? Нашел в хелпе следующее:
BL51 Putchar.obj & RAMSIZE(128) & CODE(0x0000-0xFFFF) & XDATA(0x0000-0x0FFF)
примерВвел эту строку в linker_control_file.lin, ругается на ошибку. Убрал BL51 -- не помогло.
Вообщем вот. Надеюсь на вашу помощь.