edit: erledigt. Mods bitte löschen.
Na, noch nicht ganz: Ich möchte beim Arm7 Daten im Flash ablegen: const uint32_t data_vw[] _attribute_ ((section(".rodata"))) = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,... (Die Attribute Sache braucht man eigentlich nicht, const reicht aus) Soweit so gut, die Daten stehen bei .rodata drin. Es sind 8 Bit Daten, aber ich weiss nicht ob ich die mit uint32_t ablegen soll oder mit uint8_t, da der Arm7 nunmal 32 Bit Zellen hat. Debugge ich dann mal los, um zu schauen, ob er die Daten auch holen kann schmiert der Debugger ins Nirwana beim Zugriff ab. Auch wenn ich die auf eine Variable zuweisen will, jeder Zugriff führt zum Debugger-Crash. Aufruf mit GDisplay_Show_Bitmap((uint32_t*)data_vw,sizeof(data_vw)); void GDisplay_Show_Bitmap(uint32_t *ptr,uint32_t size) { volatile uint32_t i,j,k; for (i=0;i<size;i++) { k = (uint32_t)(*ptr)++; // Hier ist Debugger weg! } Der ptr Zeiger steht absolut richtig auf der Speicherzelle im Flash wo das erste Byte liegt. Lege ich die Daten ins interne Ram, lasse also "const" weg klappt es. Hat vielleicht mal jemand ein Beispiel für den ARM (nicht AVR, da weiss ich wie es geht) wie man Daten ablegen und holen kann?
Du versuchst in dem Beispiel ins Flash zu schreiben. Das geht so nicht. Das
1 | uint32_t *ptr |
sollte auch ein
1 | const uint32_t *ptr |
sein. Wenn du ein Array aus Bytes brauchst dann kannst du das auch so anlegen. Folgendes ist also kein Problem:
1 | const uint8_t* data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; |
2 | void printData(const uint8_t* p, int size) |
3 | {
|
4 | for (int i = 0; i < size; i++) { |
5 | rprintf("%u ", *p++); |
6 | }
|
7 | rprintf("\n"); |
8 | }
|
9 | |
10 | int main() |
11 | {
|
12 | /* init...
|
13 | blah
|
14 | blupp
|
15 | */
|
16 | |
17 | printData(data, sizeof(data)/sizeof(uint8_t)); // 9/1 |
18 | }
|
Die Daten stehen dabei im Flash, wo sie mit 'const' auch hingehören.
const uint8_t* data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Dieser Ausdruck erzeugt: Initialization makes pointer from integer without a cast. Ich habs aber schon. War schon so richtig, nur statt (*ptr)++ muss ich *(ptr++) schreiben. Die alte Falle...
Ups, das Sternchen muß da weg, sonst ist es ein Zeigerarray. Passiert mir ständig...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.