[an error occurred while processing this directive] [an error occurred while processing this directive]
Вопрос по C-компиляторам для 51-х - Keil и Ride (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Беня 31 октября 2001 г. 17:25

Вот пишу программку для 51-х на Keil - и надо как можно более экономно использовать ОЗУ (встроенное). А еще в программе используются указатели, причем я знаю, что указатель может "указывать" только на внутреннее ОЗУ. Вот я его объявляю :
data char * data_char_ptr ; // это мой указатель на память data
unsigned char var_1 ; // а это просто переменная

и вот код :
data_char_ptr = & var_1 ; // указатель указывает на var_1
.
*data_char_ptr = 0x22 ;

Так вот Keil, подлец, не понимает, что data_char_ptr указывает на внутреннее ОЗУ и делает указатель 3-х байтным (т. е. универсальным как обычно - игнорирует директиву data). Получаем код :
// data_char_ptr = & var_1 ;
MOV data_char_ptr,#00H
MOV data_char_ptr+01H,#HIGH var_1
MOV data_char_ptr+02H,#LOW var_1
и
//*data_char_ptr = 0x22 ;
MOV R3,data_char_ptr
MOV R2,data_char_ptr+01H
MOV R1,data_char_ptr+02H
MOV A,#022H
LCALL ?C?CSTPTR

А вот я взял и перекомпилировал свой проект на Ride - совсем другое дело!!!
// data_char_ptr = & var_1 ;
MOV data_char_ptr,#var_1
и
//*data_char_ptr = 0x22 ;
R0,data_char_ptr
MOV @R0,#022H

Ride "понимает", что указатель ссылается только на внутреннее ОЗУ и ему достаточно 1-го байта для хранения адреса. И при обращении к нему он сразу доступается к байту с помощью косвенной адресации через R0. Экономится 2 байта ОЗУ и N байтов ПЗУ.
Так скажите мне, может у Keil есть какие-то опции, ключевые слова или уровни оптимизации, которые заставят Keil понять, что указатель может указывать только на внутреннее ОЗУ ? А может Ride "покруче", чем Keil?


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru