Hilfe bei cast (const uint8_type *)

OP #3853733
Lesenswert?
• ▲
▼
Hallo,

ich versuche mich gerade an Schreibvorgängen im Flash-Speicher 
(Programm-Speicher) des PIC18F46K22). Die Funktion habe ich 
weitestgehend aus WriteBlockFlash.c übernommen.
Ich verstehe nicht, wieso es heissen muss:
1
tbl_ptr = (const uint8_type *)startaddress;
Wenn ich dass schreibe:
1
tbl_ptr = (uint8_type *)startaddress;
so wird die Adresse des TablePointers (Register TBLPTR im PIC) beim 
Durchlaufen der Schleife (*tbl_ptr++ = *flash_array++;) nicht erhöht und 
die Funktion macht dann nicht dass, was sie soll. Ich konnte das mit dem 
Debugger testen.
1
void save_eeprom_to_flash(uint16_type startaddress, uint8_type num_blocks, uint8_type *flash_array)
2
{
3
    uint8_type flag = 0;
4
    uint8_type i = 0;
5
    uint8_type *tbl_ptr = 0;
6
    for(i=0;i<64;i++)              
7
    {
8
        flash_array[i]=i;
9
    }
10
    startaddress /=  FLASH_BLOCK_SIZE;  /*Anfangsadresse auf Vielfaches von 64Byte setzen (Blockgroesse PIC46K22 = 64Byte fuer schreiben/loeschen)*/
11
    startaddress *= FLASH_BLOCK_SIZE;
12
    tbl_ptr = (const uint8_type *)startaddress;  /*so ist es richtig*/
13
    //tbl_ptr = (const uint8_type *)startaddress;  /*falsch, Adresse von TBLPTR wird nicht in while-Schleife erhöht*/
14
    for(i=0;i<FLASH_BLOCK_SIZE;i++)                       
15
    {
16
        *tbl_ptr++ = *flash_array++;
17
    }
18
    EECON1bits.EEPGD = 1;
19
    EECON1bits.CFGS  = 0;
20
    EECON1bits.WREN  = 1;
21
    if(INTCONbits.GIE == 1)
22
    {
23
        flag = 1;
24
        INTCONbits.GIE   = 0;
25
    }
26
    EECON2 = 0x55;
27
    EECON2 = 0xAA;
28
    EECON1bits.WR    = 1;
29
    while(EECON1bits.WR == 1);
30
    if(flag == 1U)
31
    {
32
        INTCONbits.GIE   = 1;
33
    }
34
    EECON1bits.WREN  = 0;
35
}

Vielen Dank
OP #3853784
Lesenswert?
• ▲
▼
Ich habe noch eine Aufnahme vom Debugger eingefügt. Hier habe ich gerade 
einen Unterschied im Symbol Icon von *tbl_ptr festgestellt. In der 
Version mit "const" ist zusätzlich ein kleines "p" im Symbol zu sehen 
(siehe Bilder Anhang). In der MPLAB Hilfe steht, dass es sich hierbei um 
ein Objekt im Program Memory handelt.

Kann es sein dass bei
1
tbl_ptr = (const uint8_type *)startaddress;
Der Zeiger auf die Adresse direkt im Flash-Speicher zeigt? Das würde 
erklären, warum bei der anschliessenden Inkrementierung gleichzeitig die 
Adresse in TBLPTR erhöht wird (dieser zeigt direkt auf den 
Programmspeicher).
Bei
1
tbl_ptr = (uint8_type *)startaddress;
ist das nicht so, hier wird auf eine Speicherzelle im RAM gezeigt???
Das verwirrt mich....
Angehängte Dateien:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.