aesok
Участник-
Постов
596 -
Зарегистрирован
-
Посещение
-
Если Ваш вопрос звучит зачем оборачивать в .do{ .....}while(0); (c точкой с запитой), то пусть за свой код отвечает автор. Ссылку я привел для него чтобы он руководствовался знаниями, а не поговоркой "Слышал звон, да не знаю где он.'. Когда я пишу макрос то хочу чтобы он работал всегда а не только "в данном случае", и поэтому всегда оборачиваю мнотострочный макрос в .do{ .....}while(0) (без точки с запятой). Анатолий.
-
ответ тут: http://ru.w3support.net/index.php?db=so&id=1067226 Анатолий.
-
Если Вас устроит халтурное решение, то перечитайте пост 11, и ... ... ответте на этот вопрос сами. Анатолий.
-
Нужен електронный ключ на 2А
aesok ответил letis тема в В помощь начинающему
Logic-level MOSFET. -
В первом посте Вы написали что у Вас еть осцилограф, что он показывает на шине +5В? Анатолий.
-
В настоящее время нельзя. Анатолий.
-
Не понял вопроса. Eric Weddington занимаеться сборкой WinAVR и является автором avr-libc. Анатолий.
-
Да, libscanf_min.a и libprintf_min.a входят в avr-libc. Анатолий.
-
В результате недолгих поисков в гугле удалось выясни ть что ioavr.h заголовычный файл компилятора IAR Анатолий.
-
Это я и пытаюсь показать на примере 777777 Никаких варингов нет. Да, с небольшим уточнением, если эта дополнительная функция проинлайнилась в foo () и указатель p_a в ней не используеться, то записи двойки в 'a' не будет. Анатолий.
-
#include <avr/io.h> #include <avr/interrupt.h> extern void foo (void); volatile int volatile * p_a; int main() { foo (); foo (); return 0; } void foo (void) { static int a = 1; p_a = &a; a = 2; cli (); // предположим что в этот момент управление // передаеться обработчику прерывания и в нем // происходит чтение локальной переменной 'a' // через указарель 'p_a'. sei (); a = 3; return; } Вопрос: Какое значение получает обработчик прерывания через указарель 'p_a', если код скомпилирован с -Os? Кто считает что 2? .global foo .type foo, @function foo: ldi r24,lo8(a.1233) ldi r25,hi8(a.1233) sts p_a+1,r25 sts p_a,r24 /* #APP */ ; 23 "main.c" 1 cli ; 0 "" 2 ; 30 "main.c" 1 sei ; 0 "" 2 /* #NOAPP */ ldi r24,lo8(3) ldi r25,hi8(3) sts a.1233+1,r25 sts a.1233,r24 ret .size foo, .-foo .global main .type main, @function main: rcall foo rcall foo ldi r24,lo8(0) ldi r25,hi8(0) ret .size main, .-main .comm p_a,2,1 .data .type a.1233, @object .size a.1233, 2 a.1233: .word 1 Правильный ответ: при первом вызове foo () 1, при последующих 3. Анатолий.
-
> 1. как память slave может влиять на SPI никак не должна. > 2. если ввести таймаут (см. выше) то память читается. похоже на то что гдето происходит несанкционированое обращение к SPSR и/или к SPDR, скорее всего чтение. Анатолий.
-
ну и еще один пример тогда, конечно с -Os: #include <avr/io.h> int main() { } volatile int volatile * p_a; void foo (void) { static int a; p_a = &a a = 2; sei (); // переменая 'a' через указатель 'p_a' используется в обработчике прерываня // и ожидается что ее значение равно 2. cli (); a = 3; return; } Анатолий.
-
Проверте сами, может ли компилятор выкинуть static перемную. void foo (void) { static int a; a = 2; return; } Скомпилируйте код. Я бы на месте оптимизатора ее выкинул. Или по крайней мере запись в нее. Анатолий.
-
Как запрограмирован фьюз M103C? Как скомпилировалась строка rx = SPDR;? Проверте везде не только в функции DF_SPI_RW, но и во всех местах где она проинлайнилась. не выкинул ли ее компилятор. Есть ли в других местах программы обращение к регистру SPDR? Поставте в отладчике остановку по обращению к адресу SPDR, возможно в него кто то пишет по указателю. Состояние бита WCOL в SPSR? Анатолий.