Új hozzászólás Aktív témák
-
CPT.Pirk
Jómunkásember
Sziasztok!
Úgy fújta a szél, hogy most c++,java,pascal,assembly és qbasic után sima C-t kell tanúlni fősulin. A dolog megyeget, meg is írtam egy email cím ellenőrző progit, de azzal kapcsolatban lenne kérdésem.
ugyan nem volt kikötve, honnan kell vennie a proginak az emailcímet, én scanfel kértem be egy char tömbbe, aztán hosszellenőrzés, majd vizsgáló ciklusok, stb...
Viszont a tanár úr kiakadt, mondván a scanf olyan, mintha a viszkető szemünket a seggünkön keresztűl akarnánk megvakarni. (igyekeztem pontossan idézni) Valami hasonló dolgot mondott a getchar()-ra is, ott a pascalosokra utalva, de azt nem használtam. Szóval valami átadásos dolgot kell majd megoldanom, hogy pl. program.exe asdfg@fgg.hu -ból kiszedje az emailcímet magának. ilyen argv meg nemtudom dolgok kellenének nekem oda main fgv-be...
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Aha, okés. Ennek a működése világos, tanár ezt is tanította, meg ezt várta el, de ha nem adja meg, hogy honnan szedjen be a progi email címet, akkor elvileg szabad kezem lenne a döntésben... Viszont a scanf utálat okára még nem jöttem rá.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Van egy problémám.
Üres stringet kell detektálnom C-ben. A probléma, hogy kvázi függvénybe kell ezt megcsinálni, hogy máshonnan kapjon stringet, szal nem előre a kódba írt stringet kell vizsgálni.
Szóval valahonnan jön a script, ráadásul még pointerezni is kell. Ötletek?Sokat próbáltam a pointereket, de nem akar menni a dolog. Pl. próbáltam kiírni a pointer által mutatott string elemeit, de csak számokat kapok.
Van pl. az argc *argv-s argumentum bekérés, hogy tudom megcsinálni, hogy átkerüljön a tartalma egy sima tömbbe, amivel lehet dolgozni?
Meg ilyen alap kérdések, plusz pár dolog, amiből még kérdezni sem tudok.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Ilyesmire gondolok, de még tudnia kel azt, hogy a space és tabulátor esetén is ürse scriptet ad vissza, azok esetében viszont akkor más karakter nem lehet. Szal ne bonyolítsuk, ha csak egy karakteres a string, akkor meg kellene nézni, hogy spacve v. tab van-e, vagy ha egyik sincs, akkor meg amit te írtál. Ezeket kellene egybegyúrni.
Viszont egy kis magyarázatot kérnék, én legalább egy IF függvénnyel gondolkodtam eddig.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Bedobva a fordítóba, már rögtön a bool után hiányol valamit.
Ha jól értem:
bool isempty(char *s) - itt az *s lesz az a string, amit vizsgálunk.char *p; -csinál egy pointert. De ez most mutat valamire? Vagy csak üres tömb?
for (p=s; *p; ++p) - itt a kezdőérték mi? A p megkapja az s elemeit? A feltétel meg az hogy amíg van eleme, és addig a ++p lépteti az elemeket?
if (*p != ' ' && *p != '\t') - itt a space és a tab vizsgálat van, ez tiszta.
Hogyan tudnám összehozni a dolgot mondjuk egy scanf-el? Az argv dolog szerintem itt nm jó, mert annak alapból az első eleme a file neve. A t. tanárúr nem szereti a scanfet, de kipróbálni jó lenne.
Régen volt a C, lua-ban csináltam pár dolgot az elmúlt 2 évben, az sokkal egyszerűbbnek tűnik egyenlőre.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
No, ellestem pár dolgot órán, meg elvileg csak annyit kell csinálnom, hogy üres-e a string, mert a tab, space vizsgálat már a köv. srác dolga, aki az strIsBlank-et írja.
Órán eddig jutottam el:
int main ()
{
char test[]="abc";
strIsEmpty(test);
return 0;
}
int strIsEmpty(const char *str)
{
while(str)
if(!*str || !str)
printf("ures string");
return 1;
printf("nem ures a string");
}Nem volt időm lejavítani, majd holnap megcsinálom. A lényeg az, hogy be kell mutatni a működést is, ezt ott a mainben egy string értékadással oldottam meg. Azzal volt bajom főleg, hogy hogyan jut át a string, pointer egyik függvényből a másikba. Lua-ban sokkal egyszerűbb volt leírni olyasmit.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Igen, while-nál kimaradt, a pointerrel meg kezdek valamit. Az óra végén csak egy fordításra volt időm, akkor nem adott hibát, de végtelen ciklus volt, mert rossz feltételt írtam a whilehoz. Per pill itt sem tudom lefuttatni, mert nem tudok átlépni a linuxra egy fontos feltöltés miatt, aztán itt a w7 x64-en csak a cygwin van fent, de az meg amit lefordít, az exe hiányol egy nem létező 64 bites dll-t a cygwinből. Van más alternatíva, de nem akarok win alatt progni, majd holnap megcsinálom Mint alatt, csak bedobtam a félkész kódot, hogy kb. mi a terv.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
No, végre összeállt a dolog. Miután végiggondoltam, rájöttem h. nem is kell nekem végiglépkedni a stringen, felesleges az egész while cucc bele, mert az már másnak a feladata, hogy akkor is üres stringet adjon vissza, ha space, tab van benne, nekem csak simán üres stringet kell keresnem. Beírva valamit a test[] mögé, frankón eldönti, hogy mi a helyzet. Szóval szerintem jó így.
#include <stdio.h>
int main ()
{
char test[]="";
strIsEmpty(test);
return 0;
}
int strIsEmpty(const char *str)
{
if(!*str || !str){
printf("A string ures\n");
return 1;
}
printf("Nem ures a string\n");
}Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Igen, jó h. szóltál a return 0; miatt, tényleg hiányzott, valamit mindig elfelejtek.
Egyébként a gcc nem szólt a return hiánya miatt és futási problémát sem tapasztaltam.Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
No, talált is valamit:
gcc -Wall strempty.c
strempty.c: In function ‘main’:
strempty.c:6: warning: implicit declaration of function ‘strIsEmpty’Az volt a gondja, hogy előbb volt a main rész, mint a benne hivatkozott strIsEmpty.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz Gergosz2 #2154 üzenetére
codeblocks elvileg megy win7 alatt. Viszont egy nagyságrenddel kevesebb a szopás linux alatt, pl. Ubuntu, Mint...
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Ha így kérek be szöveget:
int main(int argc, char **argv)
Akkor hogy lehet hozzá alakítani az strlen függvényt?
strlen:
int strlen(const char *s)
{
int len = 0;
while(*s++) len++;
return len;
}Meg kellene számolnom a bemenetre érkező betűket az strlen() használata nélkül.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Valami biztos, de honnan? Csak a lényeget copyztam be.
Szóval a standard inputra érkező karaktereket szeretném megszámolni.
Pl. progi.exe asd fgh jklmAz simán megy, hogy hány argumentumom van, meg azokat ki is tudom íratni, de argumentumot karakterenként kiírni nem tudom, az nem akar sikerülni.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Köszi srácok! A belső ciklust felejtettem el megcsinálni, így most jó lett:
- a szóközt is számolom, az első szóköz és a lezáró 0 közti karaktereket számolja
#include <stdio.h>
int i, j, len = 0;
int main(int argc, char *argv[]){
for (i = 1; i < argc; i++)
for (j = 0; argv[i][j]; j++)
len++;
len = len + (i-2);
printf("hossz: %d\n", len);
return len;
}Hogyan lehet az argc, *argv[] -vel bekért karaktereket egy másik függvény számára átadni? Igazából úgy lenne frankó, ha a számolás nem a mainben lenne, bár így sem rossz.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Hmm, ezen az argc argv-s módon egyáltalán van lehetőség a szóközök számolására? Mert ha csak egy sima stringem van, akkor ott simán meg lehet számolni benne mindent, de így meg nem érkezik szóköz a bemenetre...
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz Jester01 #2216 üzenetére
Az a gond, hogy az egyszerű dolgokhoz bevált linuxos gcc-s fordítás nem akar menni nálam, vagyis a lefordított fájlt nem engedi futtatni, hozzáférés megtagadva hibát kapok, aztán emelt hozzáféréssel meg valami ) zárójelet hiányol, de nem a programom hibás, mindegy neki h. mit fordítók le, még egy hello wordnél is ez van, így most kénytelen vagyok win alatt csinálni.
Arra sajnos nem jöttem rá, hogy Linuxon CodeBlocks-al hogyan lehet lefuttatni úgy, hogy kapjon is valami argumentumokat.Szóval akkor win alatt egyszerűen a cmd szedi ki a fölösnek ítélt spaceket?
Átírtam most külön fgv-be a dolgokat, valamint tettem bele vizsgálatot arra, ha nincs argumentum.
#include <stdio.h>
int i, j, len = 0;
int strLen(int argc, char *argv[]){
for (i = 1; i < argc; i++)
for (j = 0; argv[i][j]; j++)
len++;
if(i==1){
len = 0;
}
else
len = len + (i-2);
printf("hossz: %d\n", len);
return len;
}
int main(int argc, char *argv[]){
strLen(argc, argv);
return 0;
}warningot nem kaptam, korrekt amit csináltam?
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz Jester01 #2220 üzenetére
Linux alatt (mint10, Ubuntu alapú) a gcc hiba nélkül megcsinálja az a.out fájlt, csak mikor futtatnám ./a.out, akkor kiírja, hogy hozzáférés megtagadva. Sudo meg sh, stb.-vel futtatva meg azt írja, hogy egy ")" hiányzik, de nem írja honnan. Az biztos, h. nem az én kódomból, mert akármit fordítok le, mindig ezt hiányolja. A 9-es mintel még simán forítottam gcc-vel.
Egyébként igen, 1szóközt feltételez a dolog, ha jól néztem, win alatt a több szóköz is csak egynek számít a cmd-ben.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Ha jól emlékszem volt, de adtam neki minden jogot a chmod-dal, és az sem segített. Ráadásul 2 telepített mint 10 van nálam, és mind a kettőn ez a helyzet.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Hmm, milyen ismerős ez a feladat a villany karról.
Az első csak annyit csinál, hogy kiírja, amit a program kapott a standard input bemenetére, szavanként.
A második egy pointerrel dolgozik, de ezeket így egy fájlba kellene tenni, hogy a standard inputra érkező szöveget megszámolja karakterenként. Egyébként nem tudom, hogy a prog1-eseknek kell-e pointerrel dolgozniuk, mintha az a prog2 anyaga lenne, már régen volt. Ilyen megoldást a prog3-ban használtunk stringek nézegetésére.
Egyrészt használd a programkód gombot kód beillesztésekor, másrészt picit olvass vissza pár hozzászólást, ha már az strLen()-t írod.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Figyelj, nem állok neki kommentezni, ezt a progit nem látom át. Pár hsz-el arrébb írtam egy strlen-t, ami nem tökéletes, a több szóközt is egynek számolja, de attól független működik, és érthető.
Azt esetleg kommentezhetem, csak aztán Zamek kérdez egyet keresztbe, és hopp... Ráadásul azt a kódot is egy sorstársadnak írtam, jobbat per pill nem tudok.Szal azt mondom, ha át akarsz menni a tárgyból, akkor a C könyvet olvasd el, aztán googlere fel, for ciklus, string műveletek, stb.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Van nekem egy kódom, ami ránézésre nekem tetszik, de assertes teszten mindig elbukik. Mi a gáz vele?
char *strChomp(char *buffer)
{
char c;
if (buffer && *buffer)
while (*buffer++){
c = buffer;
if (c == "\n")
*buffer = *(buffer--);
return *buffer;
}
return NULL;
}Annyit kell csinálnia, hogy leszedi a sorvégi új sor jelet, ha van.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz Jester01 #2588 üzenetére
No alakítottam rajta egy kicsit.
char *strChomp(char *buffer)
{
if (buffer && *buffer) {
while (*buffer != '\0') {
if (*buffer == '\n') {
if (*buffer++ == '\0') {
*buffer = '\0';
return buffer;
}
}
buffer++;
}
return buffer;
}
return NULL;
}Így most elvileg végigmegy a sztringen karakterenként a lezáró nulláig. Közben ha talál \n-et, akkor megnézi, hogy a rá következő karakter lezáró 0-e.
Egyébként van valami ordító hibám? Mert eddig csak és kizárólag segfaultot kaptam az assert teszteknél.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz Jester01 #2590 üzenetére
Kezdem felfogni.
if (buffer && *buffer) {
while (*buffer != '\0') {
if (*buffer-- == '\n') {
*buffer = '\0';
}
buffer++;
}
return buffer;
}
return NULL;Viszont azt nem tudom, hogy ez a felülírás amit mondtál, ez mit csinál. Mivel ha felülírjuk, akkor mindenképpen 2 darab \0 lesz a stringben. Ilyenkor magától levágódik a második \0?
Valamint hogy van ez a visszatérési érték helyreállítása?
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz Jester01 #2592 üzenetére
Uhh tényleg.
char *strChomp(char *buffer)
{
if (buffer && *buffer) {
while (*buffer != '\0') {
buffer++;
}
if (*buffer-- == '\n'){
*buffer = '\0';
}
return buffer;
}
return NULL;
}Most ha minden igaz, elmegy a végére, ha odaért, megnézi a lezáró nulla előtti karaktert, és ha az \n, akkor átírja \0-ra.
Nekem csak vissza kell adni a módosított, vagy az eredeti stringet, ha nem volt \n a végén. Ilyenkor a *buffer-t hogyan viszem vissza a kezdeti pozícióba? Ez most elég amatőr kérdés lesz, de gondolom nem egy "ellenkező irányú" while ciklussal lépdeljek vissza.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz Gyuri16 #2594 üzenetére
Lassan lassan talán felfogom már.
if (buffer && *buffer) {
char *c = buffer;
while (*c != '\0') {
c++;
}
c--;
if (*c == '\n'){
*c = '\0';
buffer = c;
}
return buffer;
}
return NULL;Kb. így gondoljátok?
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz Gyuri16 #2598 üzenetére
Hú köszi, végre egy érthető példában láttam a pointer működését.
Anno bugyi, bugyis polc, meg bugyis polcra mutató valami közti kapcsolattal magyarázták a pointert, amikor nem sikerült megértenem. Később meg csak használtuk, de mivel nekünk nem fő profilunk (heti 1 órában hogy is lehetne) a C programozás, így érdemi pointer magyarázás a későbbiekben sem valósult meg, vagy én nem fogtam fel...Köszi nektek a segítségért.
Segfaulttal majd kezdek valamit, mert assertes test meg van csinálva hozzá, szerintem csak a codeblocks szórakozik velem.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Tesztelném assertel a kódot, amiben segítettetek, de valamiért állandó segmentation faultot kapok, akármit írok a kódba, és mindig ugyanaz a szöveg teljesen.
Codeblocks-ot használok Debianon.
Ez van a main.c-ben:
void utiltest(){
printf("Util tesztelés");
assert(strChomp(NULL)==NULL);
assert(strcmp(strChomp(""),"")==0);
assert(strcmp(strChomp("abc"),"abc")==0);
assert(strcmp(strChomp("\n"),"")==0);
}
int main()
{
utiltest();
return 0;
}Akkor van még egy util.h-m:
#define UTIL_H_INCLUDED
char *strChomp(char *buffer);Valamint az util.c-ben a kód az includok után.
#include <stdlib.h>
#include "macros.h"
#include "util.h"
...Error nincs, és korábban, mikor még elég vacak kód volt bent, akkor működött a teszt.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz gygabor88 #2603 üzenetére
A buffer = c; sort kivéve ugyanaz, ami a 2595-ös [link] hozzászólásban van. Az elején pedig ott van a nullpointer vizsgálat, gondolom arra gondoltál.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
-
CPT.Pirk
Jómunkásember
-
CPT.Pirk
Jómunkásember
Talán itt a legaktuálisabb a kérdésem. Van egy problémám:
CooCox IDE (ARM-es fejlesztő környezet) alatt egy hivatalosan nem támogatott nxp procit kell életre keltenem, amiben van egy különleges mérő rész, aminek nincs nyilvános C forrása csak egy header fájl, meg .lib formában a forrás.
Ez a .lib library a KEIL környezet alá lett csinálva és ha beadom a "link library" menüben a coocoxnak, akkor csak annyit mond rá, hogy nem nem található. Szerintetek mit lehet ezzel kezdeni? A boot és egyéb fájlokat már bereszeltem, kód is fordul, ez lenne már csak vissza.Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz tototos #5097 üzenetére
EM783-as prociról van szó, ami kb. az nxp 11-es szériás procijainak felel meg, kiegészítve a mérő résszel. Mi is próbáltuk az expresso-t, de nem találtuk meg benne ezt a procit, pedig 2012 decembere óta támogatja. Egyébként java részt nuvotonban nyomulunk, coocox alatt.
Szóval azt mondod, hogy feltétlen lib-el kell kezdődjön a lib? Kíváncsi leszek rá mire jutunk hétfőn ezzel.
buherton: sajnos nem Linux alatt dolgozunk, de a coocoxnak nincs is Linuxos verziója, hiába Eclipse alapú. A linkernél -DEM783.lib lesz a paraméter, amit átad a környezet. Próbáltuk megadni neki a teljes utat kézzel is több módon, de minden esetben az volt, hogy nem találja.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz buherton #5101 üzenetére
Teljesítmény mérő lesz, de egyébként csak annyi, hogy hőkompenzált az AD rész és nem neked kell a számításokat megcsinálni.
Nem bízok benne annyira, mert ezeket a funkciókat már megvalósítottuk nuvotonban. Nekünk igazából a bemeneti szűréssel és az áram felharmonikusokkal volt bajunk, mikor a mérendő áramjel olyan szőrös volt a szkópon, mint a jeti talpa. - no meg nem volt mihez viszonyítani a mérésünket, így a pontosság kérdése függőben maradt.[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
LTO - link time optimailzation tapasztalata van valakinek?
CooCox alatt friss GCC mellett próbálgatjuk, jelentős méret csökkenést okoz a kódban, de nem vagyunk meggyőződve a fordított kód stabilitásáról.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
2 nxp proci totál meghalt az LTO-s kód rátöltése után, újraprogramozni sem lehetett őket. Mondjuk ez lehet más körülmények összjátéka is.
Nuvoton procikon használjuk még, nekem van egy nagyobb projectem amit ha LTO-val fordítok akkor elő tud állni olyan állapot, amikor befagy a cucc, de nem minden fordításkor.
Volt, hogy nyomtam egy "clear"-t az IDE-ben, újrafordítottam ugyanazt a kódot az LTO-val, erre megjavult. Ma fordítottam a tegnapi kódot, tegnap délután nem fagyott, erre ma reggel meg igen. Kivettem az LTO-t, azóta nincs fagyás.Viszont az LTO-val fordított bootloaderben meg egyszer sem tapasztaltam hibát, igaz az csak 4k, nem pedig 80 mint a főprogram.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
Sziasztok!
Mikrovezérlőben van egy delay függvényünk, ami asm-ben van írva és azt használjuk késleltetésre. Ez a függvény jól működik, viszont ha USB-t is használunk akkor a GCC O3-as optimalizációjával vagy bekapcsolt LTO-val nem jön létre az USB eszköz, míg minden más beállításban igen és jól is működik.
Azt gyanítjuk, hogy az O3 optimalizálás csinál valamit ezzel az asm kóddal és az időzítés nem lesz kellően pontos, arra pedig érzékeny az USB.
__attribute __((naked))
void delay_loop (unsigned n)
{
__asm volatile ("1: sub r0, #1");
__asm volatile (" bne 1b");
__asm volatile (" bx 1r");
}Szerintetek?
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz dabadab #5781 üzenetére
Az attribute-os sort picit más formában kellett megadnom __attribute__ ((naked)), de a GCC és a none-eabi arm-es gcc is ugyanazt fordítja a különböző opt. módokban, beteszi ami ott áll.
.cpu arm7tdmi
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 1
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "delac.c"
.text
.align 2
.global delay_loop
.type delay_loop, %function
delay_loop:
@ Function supports interworking.
@ Naked Function: prologue and epilogue provided by programmer.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
@ 4 "delac.c" 1
1: sub r0, #1
@ 0 "" 2
@ 5 "delac.c" 1
bne 1b
@ 0 "" 2
@ 6 "delac.c" 1
bx 1r
@ 0 "" 2
.size delay_loop, .-delay_loop
.ident "GCC: (4.9.2-10+14~bpo8+1) 4.9.2"Hasonló a sima GCC kimenete is. Annyit még tudok mondani, hogy GCC4.8, 4.9 és 5.x alatt is azonos a helyzet azon a gépen, ahol dolgozom.
EQMontoya: kellene valaki, aki ért hozzá.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz stepboy #5784 üzenetére
Csak tapogatózunk. Annyit tudunk, hogy a port inicializálásakor egy nagyon pontos idejű delaynek kell ott lennie, mert különben a pc nem látja. Ezen a lenti kódon egyszer kellett módosítani, mikor átváltottunk a SourceryG++ fordítóról GCC-re. Azonos beállítások mellett a GCC-s kóddal nem működött az usb. Azt hiszem meg kellett növelni az egyik értéket egyel.
Nem lenne gond a csak O2 használata, mert az O3-as optimalizáció már kódméret növekedéssel is jár, de az LTO is megöli az usb-t, miközben elég impresszív kódméret csökkentést lehet vele elérni.
Ha lesz kis időm ezzel a viszonylag sürgős munkával, akkor majd végignézem egyenként azt a pár kapcsolót, amit az O3 hoz be, hogy melyiknél hal meg az usb.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz dabadab #5786 üzenetére
Nem rossz gondolat, csak nem tudom miként lehet ezt megcsinálni a CooCox ide-ben.
stepboy: jó ötlet!
Amúgy sokfelé van hívva, ez minden időzítésnek az alapja. Az inlineolás jó kérdés, ahogy olvastam a gcc doksikat, azt O2-nél már magától csinálja, valamilyen logika alapján, független a kézi inline deklarálástól.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz stepboy #5789 üzenetére
Megpróbáltam, érdekes módon nem sikerült megtalálnom azt a részt, ami a gondot okozza. Se a delay, se az usb-s függvények O0-ra állított optimalizálása nem okozott eltérést. Majd még vizsgálódok tovább.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz stepboy #5791 üzenetére
Hmm, annyi minden feldolgozni való tudás!
Az assembly kódhoz ugyan nem értek, de kipróbáltam a te verziódat is, és azzal is ugyanazt tapasztaltam. Lehet majd nemsokára megpróbálom azt, hogy függvényenként külön bekapcsolom az O3-as optimalizálást, hátha úgy kibukik a gondunk forrása.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Politika
- Autós topik látogatók beszélgetős, offolós topikja
- Eredeti játékok OFF topik
- Kicsit extrémre sikerült a Hyte belépője a készre szerelt vízhűtések világába
- Crypto Trade
- Kerékpárosok, bringások ide!
- Mikrotik routerek
- Windows 11
- Az Apple iPadOS-t is megrendszabályozza az EU
- Borotva, szakállnyíró, szakállvágó topic
- További aktív témák...