Založen: Sep 19, 2007 Příspěvky: 3698 Bydliště: Praha
Zaslal: čt květen 09 2024, 12:52 Předmět:
mhepp napsal(a):
A není problém v té proměnné i?
Není, i je statická a proto si uchovává svou hodnotu i mezi jednotlivými spuštěními interruptové rutiny.
V principu je špatně, pokud se něco v main() porovnává a zároveň na pozadí v přerušení se s těmito daty manipuluje. Proměnná prijato je v pořádku, nemá cenu provnávat dokola nehotová data. Ale jak testování prijato tak strcmp() by se mělo provádět s vypnutým přerušením od UART. A po otestování zprávy na ON se nastaví prijato na 0 a terpve pak se povolí přerušení. V operačních systémech máme k dispozici kritické sekce nebo mutexy, tady si musíme vystačit s vypínáním/zapínámí přerušení.
neviem koľko trvá kym sa funkcia strcmp vykoná ale v prvom prípade ju voláš dookola v maine a ako už som písal ak pošleš „on\r\n“ tak sa do bufra uloží zaprava[0] = „o“ a zaprava[1] = „n“ potom „\r“ zaprava[2] = „\0“ vynuluje i=0 a „\n“ do zprava[i=0] kde je uložene „o“ prepíše na „\0“ a ak strcmp tráva dlhšie ako prijatie jedného znaku tak potom to nesedí v druhom prípade spustíš strcmp len raz pravé vtedy keď sprava je korektná.
Tož mě to taky napadlo, tak jsem se to pro zkoušku jal vyřešit takhle. A furt to nejede hm...
kód:
ISR(USART_RX_vect)
{
static int i=0;
prijaty_znak = UDR;
Ne prostě to fungovat nebude, tohle vypadalo nadějně, ale furt stejný. Přidával jsem si tam echo zpátky a co jsem odeslal to jsem dostal.
Zajímavý když dám před to zpoždění nejmíň 40ms, tak funguje.
kód:
while(1)
{
_delay_ms(40);
if (strcmp((char *)zprava,(char *)"on\0") == 0)
{
PORTA |=(1<<PORTA1);
}
Není, i je statická a proto si uchovává svou hodnotu i mezi jednotlivými spuštěními interruptové rutiny.
V principu je špatně, pokud se něco v main() porovnává a zároveň na pozadí v přerušení se s těmito daty manipuluje. Proměnná prijato je v pořádku, nemá cenu provnávat dokola nehotová data. Ale jak testování prijato tak strcmp() by se mělo provádět s vypnutým přerušením od UART. A po otestování zprávy na ON se nastaví prijato na 0 a terpve pak se povolí přerušení. V operačních systémech máme k dispozici kritické sekce nebo mutexy, tady si musíme vystačit s vypínáním/zapínámí přerušení.
A nemůže to být tak, že ta fce strcmp() na začátku provede strlen(), aby věděla, jak je to dlouhé, a na tom se zasekne, protože nemůže najít nikde nulu? Takže bych jen tak na zkoušku dal do main před ten while něco jako:
A nemůže to být tak, že ta fce strcmp() na začátku provede strlen(), aby věděla, jak je to dlouhé, a na tom se zasekne, protože nemůže najít nikde nulu? Takže bych jen tak na zkoušku dal do main před ten while něco jako:
kód:
zprava[15] = 0;
Tohleto záhadně funguje, ale proč když to moc smysl nedává, spíš už mi připadá, že se přerušení s hlavním programem nedokáže synchronizovat dostatečně rychle a tím, že před to dám nějakou část kódu tak tím dám čas aby se příkaz strcmp dokázal vyhodnotit, nic moc už mě nenapadá.
kód:
while(1)
{
zprava[15]='\0';
if (strcmp(zprava,"on") == 0)
{
PORTA |=(1<<PORTA1);
}
else PORTA &=~(1<<PORTA1);
}
}
Založen: Dec 11, 2015 Příspěvky: 189 Bydliště: Slovensko,Bratislava
Zaslal: čt květen 09 2024, 22:03 Předmět:
Bohužiaľ odpoveď už sme dostali
rnbw napsal(a):
V skompilovanom kod mozno ani ziadny strcmp nebude, pretoze kompilator usudi, ze dana podmienka sa nemoze nikdy splnit a pri optimalizacii ho odstrani.
a mal pravdu dneska som napísal presne ten kod čo sme mali naposledy pod Atmegu168 a tiež to nefungovalo
ako náhle sa v nekonečnom cykle nachádza aj akýkoľvek iný kód potom compilator ten if nezahodí a preto ty to funguje keď tam čokoľvek dopíšeš iné
Je to zaujímavý prípad -
Každopádne ale takto kontrolovať nie je správne , skús si napísať detekciu že prišli ukončovacie znaky \r\n a až potom kontroluj pomocou strcmp poprípade aj vynuluj už skontrolovane dáta, a tak tiež kontroluj aby ty premenná zprava nepretiekla.
Tak jsem to šel zkusit a nic, říkám si to je v prd... Ale zjistil jsem ,že při překladu mi to vyhodilu hlášku :c:50: warning: ignoring #pragma GCC optimize
Takže jsem otevřel makefile a našel jsem tam tohle
kód:
# Optimization level, can be [0, 1, 2, 3, s].
# 0 = turn off optimization. s = optimize for size.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s
To jsem tedy přepsal na nulu a hle už to funguje. Je tedy potom otázka jestli optimalizovat nabo ne a k čemu to vlastně slouží? Když to může udělat problém.
Na tohle bych v životě sám nepřišel, že to je překladem, takže to je pro mě novinka. Moc děkuji za spolupráci.
Určitě je to takhle nesmysl, si jen hraju abych zjistil co a jak funguje nebo ne. Právě tohle jsem řešil asi týden. Protože logicky by to jako fungovat mělo. Samozřejmě je to k ničemu program, ale hodně mě to naučilo.
Jinak jsem ten příjem o něco vylepšil, ještě tam dodělat nějaký to přetečení a bude to asi ok.
Časy uváděny v GMT + 1 hodina Jdi na stránku Předchozí1, 2
Strana 2 z 2
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.