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