пятница, 1 февраля 2013 г.

утюг с парогенератором тормозит матика 1140 плюс

4. Qwertty, 01.09.2009 03:10 Sergey_G.Кусок кода самый был самый тупой, не более того что я привел, находился внутри switch/caseНу так это не показатель. Вот совсем тупой пример:код:uint8_t var; int main(void){var = 5;while(1) { // чего нибудь делаем, var не трогаем if(var == 0) OCR1A = 20; OCR2 = 20; }}Собственно будет примерно так - загрузка в регистр 20 будет, а записи в OCR1A не произойдет. Но это вовсе не баг. Таких примеров можно много напридумывать. Но в подавляющем большинстве случаев виноват не компилятор, а программист.

3. Sergey_G., 01.09.2009 01:52 Колпилятор GCC самый последний, но глюк уже прошел, после нескольких перестановок кода. Кусок кода самый был самый тупой, не более того что я привел, находился внутри switch/caseС симулятором проблемы остались - в нем не работают прерывания от ADC. И вообще, поведение железа страным образом отличается от того, что написано в шите. Например, включив ADC и его прерывание, получаю работу в режиме free running с длительностью цикла 15 тактов После явного включения free running получил цикл 13 тактов. Возникает логичный вопрос: если free running mode включался во втором случае, то в каком режиме работал ADC в первом случае ?

2. Qwertty, 31.08.2009 23:21 Sergey_GВ листинге имеемldi r24, 20И все... полетели дальше Можно подробней - часть исходника и листинг. И версию компилятора.alexey_publicно результат тот же, 30-50 пакетов и виснет.Ничего странного - видимо секция вставлена не туда Что в прерывании то делается? У меня последнее время что то с телепатией плохо

1. Tahoe, 31.08.2009 22:56 alexey_publicЯ не хотел трогать cli-sei по причине того чтовариант с критической секцией мне нравится большеА как, по-твоему, реализована критическая секция? Вот из uCOS:код:;********************************************************************************************************; DISABLE/ENABLE INTERRUPTS USING OS_CRITICAL_METHOD #3;; Description : These functions are used to disable and enable interrupts using OS_CRITICAL_METHOD #3.;; OS_CPU_SR OSCPUSaveSR (void); Get current value of SREG; Disable interrupts; Return original value of SREG;; void OSCPURestoreSR (OS_CPU_SR cpu_sr); Set SREG to cpu_sr; Return;******************************************************************************************************** RSEG CODE:CODE:NOROOT(1) OS_CPU_SR_Save: IN R16,SREG ; Get current state of interrupts disable flag CLI ; Disable interrupts RET ; Return original SREG value in R16 OS_CPU_SR_Restore: OUT SREG,R16 ; Restore SREG RET ; Returnкод:********************************************************************************************************** Atmel AVR** Method #1: Disable/Enable interrupts using simple instructions. After critical section, interrupts* will be enabled even if they were disabled before entering the critical section.** Method #2: Disable/Enable interrupts by preserving the state of interrupts. In other words, if* interrupts were disabled before entering the critical section, they will be disabled when* leaving the critical section. The IAR compiler does not support inline assembly so I'm* using the _OPC() intrinsic function. Here are the instructions:** OS_ENTER_CRITICAL:* ST -Y,R16* IN R16,SREG* CLI* PUSH R16* LD R16,Y+** OS_EXIT_CRITICAL:* ST -Y,R16* POP R16* OUT SREG,R16* LD R16,Y+** Method #3: Disable/Enable interrupts by preserving the state of interrupts. Generally speaking you* would store the state of the interrupt disable flag in the local variable 'cpu_sr' and then* disable interrupts. 'cpu_sr' is allocated in all of uC/OS-II's functions that need to * disable interrupts. You would restore the interrupt disable state by copying back 'cpu_sr'* into the CPU's status register.**********************************************************************************************************/ #define OS_CRITICAL_METHOD 3 #if OS_CRITICAL_METHOD == 1#define OS_ENTER_CRITICAL() _CLI() /* Disable interrupts */#define OS_EXIT_CRITICAL() _SEI() /* Enable interrupts */

Комментариев нет:

Отправить комментарий