ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
7 июля
212515 Топик полностью
Ксения (24.09.2010 12:36 - 12:47, просмотров: 190) ответил fk0 на Вообще я имею мнение, что если в компиляторе для AVR такая ()() со строками, то просто данный контроллер не предназначен для тех задач, где строки в C нужны. Ну оно, в общем-то и верно: при таких объёмах ОЗУ... PIC18, кстати, тоже не предназначен. Хотя и
Компилятор здесь не виноват Флеш - это все-таки ПЗУ, а не ОЗУ, хотя и в редких случаях допускает в себя запись. Из-за этого уже на уровне инструкций МК способы записи и чтения из ПЗУ и ОЗУ различны! И эти инструкции даже сделать было нельзя одинаковыми, т.к. в ПЗУ пишется целыми страницами, а не побайтно или пословно, как в ОЗУ. Отсюда следует, что компилятор должен знать, где размещена стринговая константа - в ОЗУ или ПЗУ, потому что в зависимости от этого, ему надо готовить разный код. Соответственно тому, и библиотечные функции printf для обоих случаев должны быть разными и по-разному называться. Так оно и есть - это функции printf и printf_P. Даже если бы в архитектуре AVR было такое большое адресное пространство, в котором бы помещались одновременно ПЗУ и ОЗУ (по разным адресам, конечно), то вышеуказанную проблему это бы не сняло, т.к. все равно пришлось бы вызвать разные функции (printf и printf_P) для каждого случая. И это не говоря уже о том, что программисту все равно пришлось бы указывать, где он хочет разместить константу - в ПЗУ или ОЗУ.