Page 4 of 6

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

Posted: Thu Jul 12, 2012 3:02 pm
by serge__5518
STC wrote:serge__5518
Спасибо за проведенные исследования, к сожалению у меня пока нет времени посмотреть. Но потом сяду за эту проблему серьезно.
Прошивка, скомпилированная IAR5.50 работает без пропусков зажигания. Покатался с прошивкой 3 дня - все нормально.
Для компиляции добавил в файл Makefile_iar флаг:
CFLAGS += --separate_cluster_for_initialized_variables
Результат - изменения в листинге незначительные, но мне показалось - так лучше.

Исправления в файле ckps.c для IAR 5.50 :
1)
/*
#define flags ( (volatile ckpsflags_t*)(&TWAR) ) //note: may be not effective on other MCUs
*/
__no_init volatile ckpsflags_t ckpsFlags@0x22;
#define flags ( &ckpsFlags)

2)
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;
}

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

Posted: Fri Jul 13, 2012 7:56 am
by STC
serge__5518
Большое спасибо! Учту результаты твоих исследований при подготовке исходников к релизу.

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

Posted: Mon Aug 20, 2012 10:23 pm
by STC
Исправил прошивку в соответствии с рекомендациями serge__5518.
По поводу п.1. Достаточно было добавить ключевое слово __io (для IAR), в этом случае компилятор всегда будет знать что работает с указателем на память о области I/O. Оформил код с использованием следующих макросов:
//IAR
#define IOSPACEVAR(type, reg) ( (__io volatile type*)(&reg) )
//AVR-GCC
#define IOSPACEVAR(type, reg) ( (volatile type*)(_SFR_MEM_ADDR(reg)) )

По поводу п.2. Так как там прерывания запрещены то никаких проблем он вызывать не должен - оставил как есть. Пропуски исчезли при исправлении п.1

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

Posted: Tue Aug 21, 2012 7:10 am
by Stranger21
Могло ли это влиять на сборку ИАР 4.21а?

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

Posted: Tue Aug 21, 2012 11:14 am
by STC
Если пропуски проявлялись и на 4.21а, то скорее всего это был один и тот же баг.
На GCC по-прежнему остались пропуски. Судя по коду GCC не везде генерирует атомарный код связанный флагами в TWAR (скорее всего это особенность его генератора кода). GCC генерирует код: чтение-модификация-запись, в то время как ИАР герерирует просто инструкции cbi/sbi всегда. Работаю над этим сейчас.

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

Posted: Tue Aug 21, 2012 3:32 pm
by Stranger21
нет , пропусков не было . Имел ввиду на чтонибудь еще могло влиять ? есть у меня в глубине подсознания сомнение одно - кажется мне что Секу3 опаздывает переключать карты , при Очень резком наборе оборотов - 0.4 секунды с 800 до 6000

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

Posted: Tue Aug 21, 2012 5:13 pm
by STC
Может конденсатор на входе концевика карбюратора большой емкости стоит? :-)

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

Posted: Tue Aug 21, 2012 5:40 pm
by STC
При работе с флагами размещенными в I/O регистре GCC генерирует неоптимальный код, который является неатомарным.
Пример.

void iocfg_s_ign_out2(uint8_t value)
{
PORTD_Bit5 = value;
}

700 0000 8170 andi r24,lo8(1)
701 0002 8295 swap r24
702 0004 880F lsl r24
703 0006 807E andi r24,0xe0
704 0008 92B3 in r25,50-32
705 000a 9F7D andi r25,lo8(-33)
706 000c 982B or r25,r24
707 000e 92BB out 50-32,r25
711 0010 0895 ret

Просто безобразие. ИАР делает это 4-мя командами!

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

Posted: Tue Aug 21, 2012 6:20 pm
by ender11
тупая железяка может и не знать, как биту присвоить значение unsigned char. делает как умеет. с gcc всегда нужно смотреть, что оно там насобирало. может сделать функцию байт на 100, где нужен сдвиг влево, в может выбросить фрагмент программы.
благо, Insight может показывать сразу исходный код и как его собрало.

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

Posted: Tue Aug 21, 2012 7:43 pm
by STC
Да. Я наверное сделаю ассемблерную вставку - макрос для работы с такими флагами.