ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
26 августа
481569
ыыыыыыыыыы (21.01.2014 17:53, просмотров: 8278)
про програмирование, вернее gcc -O2 и memory barrier. в какой раз уже наступаем, но продолжаем колоться и есть кактус... все переменные volatile было так, и предполагалось, что вначале в glob_wbuf будет значение, а потом указатель инкрементируется, то есть не glob_wbuf[glob_ww++], а отдельной строчкой glob_wbuf[glob_ww]=in_buf[i]; glob_ww++; тем не менее компилер на это забил и сделал так > d30: c4 0e 00 13 ldub [ %i0 + %l3 ], %g2 <-чтение байта > d34: c2 04 00 00 ld [ %l0 ], %g1 > d38: 82 00 60 01 inc %g1 <-указатель > d3c: c2 24 00 00 st %g1, [ %l0 ] > d40: c4 2d 80 03 stb %g2, [ %l6 + %g3 ] <-запись байта то есть есть две инструкции, если между ними влезет irq, то попа... при этом происходит это крайне редко (раз в несколько часов) а если так glob_wbuf[glob_ww]=in_buf[i]; asm volatile("" ::: "memory"); // <------ !!!!! glob_ww++; то ОК < d2c: c4 04 00 00 ld [ %l0 ], %g2 < d30: c2 0e 00 13 ldub [ %i0 + %l3 ], %g1 < d34: c2 2d 80 02 stb %g1, [ %l6 + %g2 ] <-вначале копируем < d38: c2 04 00 00 ld [ %l0 ], %g1 < d3c: 82 00 60 01 inc %g1 <- затем указатель платой является "лишняя" ld, но так имхо коректнее. ------------------------------------------------------- это я к тому, что всяко лучше средства RTOS пользовать, чем самим изобретать велосипед, но тут было очень бедно с вычислительными ресурсами, поэтому...