-
Thread
AVR warum braucht String RAM?
SRAM im m328 weniger weh tut. Aber selten mal ist RAM über und flash wird knapp dann natürlich ohne PSTR("hier ist ein langer Text....")
-
Thread
ESP8266_NONOS_SDK: Welche Strings im RAM?
h, "tri_tra_trallala", 16) Dann steht "testtesttest" im RAM! Richtig wäre: > strncasecmp(h, PSTR("tri_tra_trallala"), 16) Sowas (ganz allgemein, nicht nur mit strncasecmp, was nur ein Beispiel war) würde ich gerne automatisch finden können.
Tim schrieb im Beitrag #6753318: >> strncasecmp(h, PSTR("tri_tra_trallala"), 16) > > Sowas (ganz allgemein, nicht nur mit strncasecmp, was nur ein Beispiel > war) würde ich gerne automatisch finden können. strncasecmp() wäre hier falsch, richtig
-
Thread
mktime( 16:00:60 ) -> 17:01:00?
damit bleibt tm_isdst 0 und die Rechnung stimmt. Tippfehler: TZ_Etc_UTC, ist aber identisch (TZ.h,-> PSTR("UTC0")).
-
Thread
Programmierung AVR
schneller lesen kann eh keiner! [c] // irgendwo sprintf_P(&menu[HAUPT_SCREEN][DATE_LINE-1][0], PSTR("%s %2d.%s %4d"), strWochenTagName_kurz(RTC.dow), RTC.day, strMonatsName_kurz( RTC.month ), RTC.year); // wird ins LCD kopiert //------------------------------------- for(uint8_t upd_line=0;
-
Thread
I2C-, USART-, EEPROM-Test für ein Feedback
bin. Kurz gesagt, änderst du > puts("Es war einmal ein langer String..."); in > puts_p(PSTR("Es war einmal ein langer String...")); Dann wird der String beim Programmstart nicht ins RAM kopiert, sondern direkt aus dem Flash verwendet. Der Zugriff darauf ist ein bisschen langsamer. Oder
-
Thread
Zeichenkette über UART empfangen
buf; // answer overwrite command cmd_data.args = sscanf_P(buf, PSTR(CMD_FMT CMD_FMT "%g"), cmd_data.cmd, cmd_data.par, &cmd_data.val); if (cmd_data.args != (uint8_t)EOF) // if not empty { for (command_t* cmd_p
-
Thread
uin16_t ist/wird negativ bei 0x8000.
wenn ich es zu einem uint16_t caste also so: [code] snprintf_P(strBuffer, sizeof(strBuffer), PSTR("Config 3: %d VAR: %d\r\n"), config, (uint16_t)ADS1015_REG_CONFIG_OS_SINGLE); [/code] bleibt das Ergebnis unverändert. Also immer noch negativ. Dadurch sollte der Compiler doch wissen das es sich
die Zahl auf der Seriellen aus? So: [code] snprintf_P(strBuffer, sizeof(strBuffer), PSTR("Config 3: %d VAR: %d\r\n"), config, (uint16_t)ADS1015_REG_CONFIG_OS_SINGLE); sendToSerial(COMM_INTERNAL, strBuffer); [/code] Comm_Internal gibt nur an das die Daten über den USART2 übertragen
-
Artikel
MCURSES
addstr_P. void addstr_P (const char * str) : Zeichenkette aus Flash ausgeben Beispiel: addstr_P (PSTR("Hello, World")); printw. Nur auf STM32 und Unix/Linux verfügbar: void printw (const char *fmt, ...) : Formatierte Ausgabe analog zu printf() Beispiel: printw ("Max. Anzahl Zeilen: %d, Spalten: %d",
char * s) : Zur Position (y,x), dann Zeichenkette aus Flash ausgeben Beispiel: mvaddstr_P (10, 10, PSTR("Hello World")); mvprintw. Nur auf STM32 und Unix/Linux verfügbar: void mvprintw (uint_fast8_t y, uint_fast8_t x, const char *fmt, ...) : Formatierte Ausgabe analog zu printf() Beispiel: printw (10,
-
Thread
avr-gcc: Format für Flash-String-Ausgabe?
Probier mal lieber so. const char *getstring(); Oder teste mal einfach so. sprintf(pBuf, "%S", PSTR("Hello World")); Außerdem bietet sich sprintf_P an, damit sparst du RAM, denn der Formatstring ist ja konstant. > warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument > 9
if (pTask == NameTable[i].taskAddr) return NameTable[i].name; return PSTR("***"); } [/c]
-
Thread
AVR Flash jenseits der 64kB
wieder Inline-Assembler Makros. Richtig? Nö, eigentlich nicht. Außer du brauchst Äquivalente zu PSTR bzw. FSTR. Die __flashN und __memx Adressen können alle via __memx zugegriffen werden, und __memx verdaut auch RAM-Adressen, ist allerdings aufwändiger mit seinen 3-Byte Adressen. Eine Linkerskipt-Erweiterung
Inline-Assembler Makros. Richtig? > > Nö, eigentlich nicht. Außer du brauchst Äquivalente zu PSTR bzw. FSTR. Falsch gedenkt: Auch für Äquivalente zu PSTR / FSTR braucht man natürlich /kein/ Inline-Asm.
-
Thread
_delay_ms Faktor 13 zu langsam
{ unsigned char b; b=0;^M if(UCSRA & (1<<RXC)) b=1; return b; } void usart_pstr(char *s) { while (*s) { usart_putchar(*s); s++; } } int usart_putchar_printf(char var, FILE *stream) { if (var == '\n') usart_putchar('\r'); usart_putchar
-
Thread
Arduino RAM sparen mit PROGMEM und strcpy_P()
ist # Grad Celsius", wo dann # durch die Zahl ersetzt wird, könntest zu auch das tun: ausgeben_P(PSTR("Die Temperatur ist ")); ausgeben(zahl); ausgeben_P(PSTR(" Grad Celsius")); Das würde noch viel weniger RAM belegen.
Grad Celsius", wo dann # durch die Zahl > ersetzt wird, könntest zu auch das tun: > > ausgeben_P(PSTR("Die Temperatur ist ")); > ausgeben(zahl); > ausgeben_P(PSTR(" Grad Celsius")); [c] #include <Streaming.h> void setup() { Serial.begin(9600); Serial << F("Start: ") << __FILE__ << endl
-
Thread
WLAN Steckdosen Unterschiede?
CR":"372/699"}} tasmota/support.ino- if (is_8285) { tasmota/support.ino- strcpy_P(buff, PSTR("ESP8285")); tasmota/support.ino- } else { tasmota/support.ino: strcpy_P(buff, PSTR("ESP8266EX")); tasmota/support.ino- }
-
Thread
Arduino: if(String == "ein") funktioniert nicht
an... zu dem bemängeltem Code war vom ESP der 512k SRAM hat deswegen fehlte auch strcmp_P und PSTR()
aber ich prüfe ja wieviel Byte frei sind und kann entscheiden ob ich aus dem flash lese mit strxxx_P PSTR() oder nicht!
-
Thread
ENC28J60 myEthernet mit NeMo Stack Probleme
if(ind != 255) { if(debugLevel & DEBUGLVL_STACK_TCP_ERROR) { usart_send_line_P(PSTR("tcpOpen: conn already exists")); } return ind; } // Suche nach freiem Eintrag in TCP-Verbindungsliste ind = tcpGetFreeConnEntry(); // Kein freier Eintrag mehr vorhanden if(ind == 255) { if(debugLevel & DEBUGLVL_STACK_TCP_ERROR) { usart_send_line_P(PSTR("tcpOpen: connList full")); } return 255; } else { // MAC-Adresse zu IP-Adresse ermitteln mac = arpGetMac(ipAddr); tcpConnList[ind].handler = handler; tcpConnList
-
Thread
USART Frage zu Bibliotheken
PORTD |= LED1; while(1) { PORTD ^= LED1 | LED2; _delay_ms(1000); char* pstr = "Hallo\0"; if(bUseLib) { uart0_putstr(pstr); } else { for(const char* pP = pstr; *pP != '\0'; ++pP) { while ( !( UCSRA & (1<<UDRE)) ) {}
-
Thread
Potentiometer an Mikrocontrollter
"; ....................................... manchmal klemmt es auch in strxx_P Versionen mit PSTR() wann und wo habe ich noch nicht vollständig durchblickt. Auch mag der eine Programmierer lieber const uint8_t pwmtable_11C[] PROGMEM = ...... der Andere aber const uint8_t PROGMEM pwmtable_11C
-
Thread
RFM69HW und ATTiny84
(x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:146:27: note: suggested alternative: 'PSTR' C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:146:65: error: 'DORD' was not declared in this scope spcr = _BV(SPE) | _BV(MSTR) | ((bitOrder == LSBFIRST) ? _
(x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:146:27: note: suggested alternative: 'PSTR' C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:146:65: error: 'DORD' was not declared in this scope spcr = _BV(SPE) | _BV(MSTR) | ((bitOrder == LSBFIRST) ? _
-
Thread
Probleme mit pgmspace. ATMega1284P hangt sich durch strcpy_P auf
mehrmals geraten das ich die String nicht mehr im RAM ablegen soll sondern mit den "_P" Funktion und PSTR sowie PROGMEM in den Flash auslagere. Das habe ich auch immer bis jetzt getan(Außer Serielle Nachrichten die nur zur Temporären Überprüfung waren wurden ohne _P und PSTR verwendet). Nur jetzt
erhöht ändert aber nix. Wenn ich das strcpy_P aus dem Case Fall 1 entnehme(Also strcpy_P(preIpStr, PSTR("IP"));) und im Case Fall 2 es stehen lasse(strcpy_P(preIpStr, PSTR("GW"));) dann funktioniert der Code wieder. Gibt es eine Limitierung bei PSTR/pgmspace? Der RAM ist noch nicht Ansatz weiße
-
Thread
Sonof Obi Switch und Tasmota Prellen
// Settings.flag.button_single = 0; snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_SETOPTION "13 0")); // Disable single press only ExecuteCommand(scmnd, SRC_BUTTON); }[/c] Das dürfte je nach Laufzeit (wann gedrückt), mehr schlecht als recht funktionieren
-
Thread
Flyback-Trafo: Verwirrung beim Proximity-Effekt bei parallelgeschalteten Wicklungen
www.weewave.mer.utexas.edu/MED_files/MED_research/Intrcncts/Skin_Effect_Ldr/MTT_96_poster/MMT_96_skn_crct_pstr.pdf Da kannste dir seinen parametrisierbaren Subcircuit bauen. Dann setzt du den koppelfaktor auf 1 und setzt die Streuinduktivitäten via dem Modell händisch ein. Zusätzlich lohnt es sich das
-
Thread
Nanoampere LED
erreichen 80% Wirkungsgrad und teilweise noch etwas mehr. Bei 1µA und 2,7V macht es Pel 2,7µW und ~2,2µW Pstr. Bei 470nm entspricht es 1,5*10^-4 Lumen. Dumm nur, dass man wahrscheinlich keine schwachen LEDs finden wird, die diese Wirkungsgrade haben, weil so gut sind nur die besten blauen Hochleistungs-LEDs
-
Thread
Atmega32U4-Board: USB-Ausgabe in Betrieb nehmen
im main.c steht: initialization(); // fuer UART, Pins, I2C etc. while (1){ outs(USART,PSTR("\nTest...")); // Meldung ausgeben in Schleife outs(USB,PSTR("\nTest...")); // Meldung ausgeben in Schleife } die Ausgabe auf den USART klappt, die auf USB (Zeile darunter) nicht. weiter
> outs(USB,PSTR("\nTest...")); Der String liegt im Flash, wegen PSTR. [c] while (*str) { // get next char, bis /0 outc(USB,*str++); //send char } [/c] Hier liest du Zeichen
-
Thread
Gibt es Pflanzenlicht-Einzel-LEDs?
ja schon exakt von dem physikalischen Wirkungsgrad und nichts anderem. Und ja, natürlich ist Pel - Pstr = PHeiz, wobei Pstr = Pel* η ist. Und η = L/LER, mit L der Lichtausbeute in lm/W.
-
Thread
Mehrfache if.Verkleinern
s" #define PAR_FMT "%" STR(PAR_SIZE) "s" // .. cmd_data.args = sscanf_P(buf, PSTR(CMD_FMT PAR_FMT "%g"), cmd_data.cmd, cmd_data.par, &cmd_data.val); [/c] sscanf sieht zwar eleganter aus gegenüber strtok, erfordert aber deutlich mehr Gehirnschmalz, um es auch sicher zu machen.
-
Thread
ATMega Flash wird langsam knapp. Upgrade o. Plattformwechsel?
PSTR wird doch schon benutzt.
Programmtext eigentlich beschreibst und zu welchem Zeitpunkt es eine Wirkung hat. Wenn Du im Programmtext PSTR hinschreibst und das Programm kompilierst, dann erzeugt der Compiler für _diese_ Variable, vor der PSTR steht, _keinen_ Code, der sie in das RAM kopiert. PSTR wirkt sich auf den Code aus und der Code
-
Thread
c: gcc/avr gleiche/ungleiche varianten of string declarartion
Die Strings müssen mit PSTR auch ins Flash. So liegen nur die Zeiger auf die Strings dort.
weiter rumgesucht laut https://ewiki.e-dschungel.de/software/avr-gcc geht nur variante1?! das PSTR macro kann hier nicht verwendet werden. ... ich will aber die blonde variant2 und bekomm sie nicht, gemein! mt
-
Thread
frage zu sizeof() in c
builtin_constant_p (x) ? !strcmp_P(id,x) : !strcmp(id,x)) \ ) #define match(x) match_(PSTR(#x)) #define Match(x) if(0); match(x) Hier werden Ausschnitte aus dem String als byte oder eventuall auch als word/dword (optimiert, nicht hier) verglichen. Wenn es jetzt einen Error geben würde
) wird in ein if(0); else if(id[0]=='e'&&id[2]=='a'&&6==len&&id[len-2]=='l'&&!strcmp_P(id,PSTR("enable"))) umgewandelt. Das ist dann ziemlich optimiert, auch wenn es 200 Vergleiche sind. wird hingegen match_(foo) verwendet wo foo ein char* ist, dann wird if(0); else if(id[0]==foo