Очень странное поведение gpio-программирования ATtiny25v с avr-gcc и avrdude через малиновый пи - PullRequest
0 голосов
/ 31 марта 2019

У меня ATtiny25v, подключенный к SPI Raspberry Pi.

Я использую avr-gcc для компиляции своего кода. Затем я использую avrdude, чтобы загрузить его.

Но я сталкиваюсь с очень странным явлением: основная функция не вызывается, и вместо этого первые инструкции первой функции оказывают влияние на gpio ...

У меня есть светодиод, подключенный на portb4.

... Я пробовал с несколькими чипами одной и той же модели, и все они ведут себя одинаково (за исключением одного глючного)

... Может кто-нибудь объяснить это?

ПРИМЕЧАНИЕ: Я опускаю детализацию, но ни компилятор (с -Wall -pedantic), ни avrdude (с -v -v) не выдают никакой ошибки.

и версия kcuzner, и предыдущая версия (исправлено linux_gpio http://savannah.nongnu.org/bugs/?47550) дают одинаковые результаты. kcuzner, использующий программатор linuxspi, ведет себя так же.

это:

#include <avr/io.h>
#include <avr/interrupt.h>

#define B(b) (1 << b)

void ledT(){
   PORTB ^= B(PORTB4);
}

void led(uint8_t s){
   if(s)
      PORTB |= B(PORTB4);
   else {
      PORTB &= ~B(PORTB4);
   }
}

int main(){
   PORTB = 0;
   DDRB = 0;
   USISR = 0;
   USIDR = 0;
   while(1);
   //return 0;
}

... загорается светодиод на старте.

#include <avr/io.h>
#include <avr/interrupt.h>

#define B(b) (1 << b)

void ledT(){
   PORTB ^= B(PORTB3);
}

void led(uint8_t s){
   if(s)
      PORTB |= B(PORTB4);
   else {
      PORTB &= ~B(PORTB4);
   }
}

int main(){
   PORTB = 0;
   DDRB = 0;
   USISR = 0;
   USIDR = 0;
   while(1);
   //return 0;
}

... не светится

и этот:

#include <avr/io.h>
#include <avr/interrupt.h>

#define B(b) (1 << b)

void ledT(){
   PORTB ^= B(PORTB4);
   PORTB ^= B(PORTB4);
}

void led(uint8_t s){
   if(s)
      PORTB |= B(PORTB4);
   else {
      PORTB &= ~B(PORTB4);
   }
}

int main(){
   PORTB = 0;
   DDRB = 0;
   USISR = 0;
   USIDR = 0;
   while(1);
   //return 0;
}

... также не светится.

#include <avr/io.h>
#include <avr/interrupt.h>

#define B(b) (1 << b)

void ledT(){
   PORTB = PORTB | B(PORTB3);
   PORTB = PORTB | B(PORTB4);
}

void led(uint8_t s){
   if(s)
      PORTB |= B(PORTB4);
   else {
      PORTB &= ~B(PORTB4);
   }
}

int main(){
   PORTB = 0;
   DDRB = 0;
   USISR = 0;
   USIDR = 0;
   while(1);
   //return 0;
}

... загорается светодиод

...