Jump to content

    

aesok

Участник
  • Content Count

    596
  • Joined

  • Last visited

Community Reputation

0 Обычный

About aesok

  • Rank
    Знающий
  • Birthday 07/21/1972

Информация

  • Город
    Array

Recent Profile Visitors

1539 profile views
  1. Если Ваш вопрос звучит зачем оборачивать в .do{ .....}while(0); (c точкой с запитой), то пусть за свой код отвечает автор. Ссылку я привел для него чтобы он руководствовался знаниями, а не поговоркой "Слышал звон, да не знаю где он.'. Когда я пишу макрос то хочу чтобы он работал всегда а не только "в данном случае", и поэтому всегда оборачиваю мнотострочный макрос в .do{ .....}while(0) (без точки с запятой). Анатолий.
  2. ответ тут: http://ru.w3support.net/index.php?db=so&id=1067226 Анатолий.
  3. Если Вас устроит халтурное решение, то перечитайте пост 11, и ... ... ответте на этот вопрос сами. Анатолий.
  4. В первом посте Вы написали что у Вас еть осцилограф, что он показывает на шине +5В? Анатолий.
  5. Не понял вопроса. Eric Weddington занимаеться сборкой WinAVR и является автором avr-libc. Анатолий.
  6. Да, libscanf_min.a и libprintf_min.a входят в avr-libc. Анатолий.
  7. В результате недолгих поисков в гугле удалось выясни ть что ioavr.h заголовычный файл компилятора IAR Анатолий.
  8. Это я и пытаюсь показать на примере 777777 Никаких варингов нет. Да, с небольшим уточнением, если эта дополнительная функция проинлайнилась в foo () и указатель p_a в ней не используеться, то записи двойки в 'a' не будет. Анатолий.
  9. #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. Анатолий.
  10. Проблема с SPI

    > 1. как память slave может влиять на SPI никак не должна. > 2. если ввести таймаут (см. выше) то память читается. похоже на то что гдето происходит несанкционированое обращение к SPSR и/или к SPDR, скорее всего чтение. Анатолий.
  11. ну и еще один пример тогда, конечно с -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; } Анатолий.
  12. Проверте сами, может ли компилятор выкинуть static перемную. void foo (void) { static int a; a = 2; return; } Скомпилируйте код. Я бы на месте оптимизатора ее выкинул. Или по крайней мере запись в нее. Анатолий.
  13. Проблема с SPI

    Как запрограмирован фьюз M103C? Как скомпилировалась строка rx = SPDR;? Проверте везде не только в функции DF_SPI_RW, но и во всех местах где она проинлайнилась. не выкинул ли ее компилятор. Есть ли в других местах программы обращение к регистру SPDR? Поставте в отладчике остановку по обращению к адресу SPDR, возможно в него кто то пишет по указателю. Состояние бита WCOL в SPSR? Анатолий.