При работе с машинкой, у которой ПЗУ 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
Что не так сделал?