Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: KEIL и Code Banking
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
one_man_show
При работе с машинкой, у которой ПЗУ 128К, столкнулся с необходимостью управления переключением банков памяти. Работал в TASKING EDE, там поддержка есть на уровне безошибочной компиляции и линковки, а само переключение делаешь "руками", среда не понимает особенностей и регистров выбранного процессора, в моем случае Cygnal C8051F123. Вынужден был перейти на KEIL, как более подходящий под эти машинки. Сказано, что Code Banking поддерживается, на то есть работающие примеры, но везде таблицы данных слишком малы и в основном демонстрируется переключение банков для вызова функций. Все действительно работает.

Моя проблема. В проекте таблица 64КБ и код 4КБ. Идеология Code Banking у Cygnal предполагает четыре банка по 32К. Разбил таблицу на три части, чтобы положить в три банка, создав для этого три файла и каждому указал, в каком банке ему жить.

Начались первые заморочки с Кейлом: не принимает одним куском всю таблицу, говорит SPECIAL INITIALIZER EXCEED 8K. То есть нельзя использовать инициированные массивы более 8КБ, почему? Ладно разбил каждую таблицу на три части так, чтобы каждая вышла не более 8К. Тепереь говорит ADDRESS SPACE OVERFLOW. То есть совсем не понимает, что я хочу положить таблицы в разные банки и постоянно старается хотя бы одну засунуть в банк COMMON, что мне совсем не нужно.

Может быть кто-то хорошо знающий Кейл подскажет как быть.
Что имеем: четыре файла с исходниками, первый содержит main (назначен банк COMMON), остальные содержат таблицы данных, каждая по 7280 char элементов, по три таблицы в каждом файле (каждой назначен свой банк с 1 по 3). В каждом файле функция для обращения к своей таблице. В проект включены два ассемблерных файла, стартовый и для управления банками. В проекте включаю поддержку Code Banking, выбираю 4 банка, назначаю Bank Area 0x8000-0xFFFF.
Модель SMALL, так как пока ОЗУ не пользуюсь.
Таблицы объявлены так:
char code tab1[7280] = {...данные...}, чтобы попали в область кода, а не XDATA.
Ругается на один из файлов с таблицами: ADDRESS SPACE OVERFLOW

Что не так сделал?
one_man_show
Почитав ряд форумов, удалось разобраться.
Оказывается, чтобы банковать данные, нужно в опциях "BL Misc", в поле "Misc controls" указать:
BANK1(?CO?имя_модуля1)
BANK2(?CO?имя_модуля2)
BANK3(?CO?имя_модуля3)

Надо же было до этого додуматься. Ни в одном апликейшн ноутс ничего подобного нет, в хелпе нет, в описании на С51 и uVision тоже ничего нет.
Спрашивается, зачем все это нужно добавлять в опции, если в проекте явно для каждого файла задано, что их нужно разложить по разным банкам. Ответ нашел всего в одном посте на форуме Кейла: по умолчанию все настройки банков имеют эффект только относительно КОДА, а данных это не касается. Указанные установки привязывают сегмент ?CO (CONST) к разным банкам памяти.

А мне дурному казалось, что банки в большинстве применений задействуются в первую очередь под таблицы, а не под код. Это что же надо наворотить для 8-битного камня на 128К? В этом случае может быть лучше взять другой камень.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.