Page 3 of 6

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Wed Jul 04, 2012 9:12 pm
by serge__5518
STC wrote:
\ 0000001A REQUIRE _A_PORTD
\ 0000001A REQUIRE _A_PORTC
\ 0000001A REQUIRE _A_DDRD
\ 0000001A REQUIRE _A_DDRC
Это скорее всего перечисление внешних связей - переменных используемых в данной функции. В данном случае это ячейки памяти в ОЗУ соответствующие регистрам портов.
Посмотрел листинги от skodafelicia (ckps_421A.zip и ckps_610.zip).
В файле ckps.с есть отределение:
#define flags ( (volatile ckpsflags_t*)(&TWAR) )

IAR 4.21 работает со структурой ckpsflags_t как с I/O регистром, т.е. например :
flags->ckps_need_to_set_channel = 0;
CBI 0x02, 0x05

IAR 6.10 (5.50) работает со структурой ckpsflags_t как с областью памяти(данными), например:
flags->ckps_is_valid_half_turn_period = 0;
LDI R26, LOW(34)
LDI R27, (34) >> 8
LD R16, X
ANDI R16, 0xFD
ST X, R16
При этом, в некоторых случаях, вставляет и вызовы функций...

Думаю, это может увеличить время выполнения операций с ckpsflags_t. Насколько критично время выполнения операций со структурой ckpsflags_t - не знаю. Хотя мне больше нравится подход компилятора V4.21.

PS
У меня IAR 5.50, скомпилировал - появляются пропуски.
Как заставить IAR 5.50 работать с ckpsflags_t как с I/O регистром, пока не придумал....
Есть какие нибудь мысли на этот счет?

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Fri Jul 06, 2012 8:08 pm
by serge__5518
Думаю, что проблема пропусков при компиляции в IAR версии выше 4.21 (далее IAR 5.50), в более строгом следовании последних версий стандартам языка С.
Сруктура ckpsflags_t располагается в регистре TWAR для быстрого к ней доступа. IAR 5.50 обращается к области памяти, где находится регистр используя не простые ассемблерные команды CBI и SBI, а связку нескольких команд. Что увеличивает время выполнения.
В общем, если в файле ckps.c сделать следующие изменения:
/*
#define flags ( (volatile ckpsflags_t*)(&TWAR) ) //note: may be not effective on other MCUs
*/
__no_init volatile ckpsflags_t ckpsFlags@0x22;
#define flags ( &ckpsFlags)

то листинг фала после компиляции IAR5.50 , будет мало чем отличаться от листинга генерируемого IAR4.21 (во всяком случае , что касается работы с flags)
Правда, для точного соответствия, :) в функции
uint8_t ckps_is_cycle_cutover_r() надо сделать следующие изменения:
uint8_t ckps_is_cycle_cutover_r()
{
uint8_t result;
_BEGIN_ATOMIC_BLOCK();
//result = flags->ckps_new_engine_cycle_happen;
result = 0;
if(flags->ckps_new_engine_cycle_happen)
result = 1;
flags->ckps_new_engine_cycle_happen = 0;
_END_ATOMIC_BLOCK();
return result;
}

Еще не успел проверить на машине....

PS
Если использовать не: #define flags ( &ckpsFlags)
а, создавать ссылку на объект :
ckpsflags_t* tFlags = &ckpsFlags;
то опять включается механизм доступа через область памяти....
При непосредственном доступе к объекту: ckpsFlags.ckps_need_to_set_channel
генерируется нормальный листинг.

А в общем, IAR5.50 поступает правильно, а прошивка работает не очень правильно :) . Более того, сам _объект_ структуры ckpsflags_t в файле ckps.c не создается, а назначается в #define...
В файле ckps.c (ревизии secu-3_software_release_02022011)
объект структуры ckpsflags_t создается строкой:
__no_init volatile ckpsflags_t flags@0x22)
и IAR5.50 генерирует "правильный" листинг.
Если кто-то пробовал в 2011 году собирать прошивку secu-3_software_release_02022011 с IAR5.50 (или IAR > 4.21) и пропуски остались - то я "немножко неправ" :), и надо копать глубже... или искать IAR 4.21 :)

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sat Jul 07, 2012 3:43 pm
by STC
serge__5518
Спасибо за проведенные исследования, к сожалению у меня пока нет времени посмотреть. Но потом сяду за эту проблему серьезно.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sun Jul 08, 2012 5:44 pm
by SvatSV
Не могу нагуглить IAR версии 4.21а. В нете есть версии 5 и 6, но как я понял они некорректно компилят прошивку.
Кто может дать рабочую ссылку на версию 4.21а.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sun Jul 08, 2012 6:06 pm
by Stranger21
он есть .... он все еще есть ...

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sun Jul 08, 2012 7:11 pm
by SvatSV
он есть .... он все еще есть ...
Stranger21, спасибо за "реальную" помощь. Он жил, жив и будет жить.

Вопрос остается открытым.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Mon Jul 09, 2012 3:48 am
by Stranger21
ну находили недавно его ... кажется ник был шкодафелиция ... у меня ссылки протерялись . тут нельзя постить было ... буквально месяц назад находили

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Mon Jul 09, 2012 12:45 pm
by dimonfish
а найти иво еще тот гемор... подтверждаю :-)
SvatSV, смотри личку ;-)
сюда (и никуда) линк не выкладывать!!!
через пару дней файл - бахну
ПС. кстати и внимательно читаем "ридми" с самого начала ;-)

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Mon Jul 09, 2012 4:47 pm
by SvatSV
dimonfish, тебе большое спасибо. Конкретный вопрос, конкретное дело. Ещё раз спасибо.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Mon Jul 09, 2012 8:35 pm
by dimonfish
да че там :) правильно заданный вопрос - 80% ответа :)