symbions (23.10.2014 11:40, просмотров: 3700)
Здравствуйте Спрашивал несколько лет назад в ФИДО, но решил тогда оптимизацией кода. Счас никак нельзя по другому:
Пишу на SDCC для C8051F350.
Память программ (8кБ флэш - выполняет также функцию ЕЕПРОМа) имеет организацию в виде блоков по 512 кБайт, стираться может только целиком по одному блоку, чтобы перезаписать - надо сначала стереть, потом записать (классика, в общем).
Последний блок (16-ый == 0x1E00-0x1FFF) мне недоступен - я так понял, что его использует загрузчик при программировании. В предпоследнем блоке (15-ый == 0x1C00-0x1DFF) в последнем байте хранится защита блоков, поэтому этот блок я могу стирать только при программировании, из программы мне его не возможно стереть.
После очередной модификации программа у меня стала заканчиваться по адресу 0x1A7f - в 14-ом блоке. Раньше в этом блоке лежали настройки, теперь считать настройки я могу, а запрограммировать в процессе работы (в результате калибровки, настройки) - уже не могу, так как в результате тру код программы.
Задумал перенести в 15 блок одну функцию (она 260 байт занимает), чтобы программа в 14 блок не влазила - и вот не смог разобраться как в SDCC это сделать. Указываю размещать данные по адресу 0x1A00 - 0x1BFF компилятор всё равно ложит код в 14-ый блок. Перепробовал всё, до чего только смог додуматься после чтения документации, - пофиг.
Собственно ответ сводился к фразе:"Есть мысль поместить функцию в дpугой сегмент, котоpый линкеpом pасположить по нужному адpесу. Функцию для удобства лучше в отдельный модуль поместить."
Сейчас разбираюсь с сегментами, но тоже как-то оно странно описано.