[Numérique] pic32mx795f512l mémoriser en flash
Répondre à la discussion
Page 1 sur 6 12 3 4 5 DernièreDernière
Affichage des résultats 1 à 30 sur 156

pic32mx795f512l mémoriser en flash



  1. #1
    davidif

    pic32mx795f512l mémoriser en flash


    ------

    Bonjour,

    Je suis en train de programmer un pic32mx795f512l en ethernet et un module wifi.

    Je communique bien avec, seulement j'essai de pouvoir mettre mes nouveaux paramètre réseaux (ip, mask, passerel, ...) en flash interne pour pouvoir les prendre en compte lors d'un reboot.

    J'ai donc trouvé ou récupérer ma nouvelle ip une fois le reboot fait, en allant voir dans le buffer de réception :

    dans la fonction custom_http_app.c

    Code:
    if(!strcmp((char *)httpDataBuff, (const char *)"ip"))
            {   // Save new static IP Address
            
            //**ajouté par moi
            for ( inc=6; inc<25; inc++) 
            {    
            val = *( httpDataBuff+inc);
            }
            //************************  
                
                if(!TCPIP_Helper_StringToIPAddress((char *)(httpDataBuff+6), &newIPAddress))
                {
                    bConfigFailure = true;
                    break;
                }
                strncpy(httpNetData.ipAddr, (char *)httpDataBuff + 6, sizeof(httpNetData.ipAddr));
            }
    J'ai placer un "for" pour voir le contenu du buffer, qui présente bien la nouvelle ip, seulement celle-ci n'est pas enregistré en flash ce que j'aimerai faire pour pouvoir l'initialiser au redémérrage

    J'ai repéré l'emplacement ou l'on initialise les paramètre réseau par défaut, ou je pourrai donc charger les nouveaux paramètres
    pour comprendre le fonctionnement, j'ai changer directement la valeur de l'IP pour voir si ça fonctionnait, ce qui est le cas.

    Code:
    const TCPIP_NETWORK_CONFIG __attribute__((unused))  TCPIP_HOSTS_CONFIGURATION_NEW[] =
    {
    /*** Network Configuration Index 0 ***/
        {
            TCPIP_NETWORK_DEFAULT_INTERFACE_NAME,       // interface
            TCPIP_NETWORK_DEFAULT_HOST_NAME,            // hostName
            TCPIP_NETWORK_DEFAULT_MAC_ADDR,             // macAddr
             TCPIP_NETWORK_DEFAULT_IP_ADDRESS,           // ipAddr
            TCPIP_NETWORK_DEFAULT_IP_MASK,              // ipMask
            TCPIP_NETWORK_DEFAULT_GATEWAY,              // gateway
            TCPIP_NETWORK_DEFAULT_DNS,                  // priDNS
            TCPIP_NETWORK_DEFAULT_SECOND_DNS,           // secondDNS
            TCPIP_NETWORK_DEFAULT_POWER_MODE,           // powerMode
            TCPIP_NETWORK_DEFAULT_INTERFACE_FLAGS,      // startFlags
           &TCPIP_NETWORK_DEFAULT_MAC_DRIVER,           // pMacObject
        },
    /*** Network Configuration Index 1 ***/
        {
            TCPIP_NETWORK_DEFAULT_INTERFACE_NAME_IDX1,       // interface
            TCPIP_NETWORK_DEFAULT_HOST_NAME_IDX1,            // hostName
            TCPIP_NETWORK_DEFAULT_MAC_ADDR_IDX1,             // macAddr
            "192.168.1.135",           // ipAddr      
            TCPIP_NETWORK_DEFAULT_IP_MASK_IDX1,              // ipMask
            TCPIP_NETWORK_DEFAULT_GATEWAY_IDX1,              // gateway
            TCPIP_NETWORK_DEFAULT_DNS_IDX1,                  // priDNS
            TCPIP_NETWORK_DEFAULT_SECOND_DNS_IDX1,           // secondDNS
            TCPIP_NETWORK_DEFAULT_POWER_MODE_IDX1,           // powerMode
            TCPIP_NETWORK_DEFAULT_INTERFACE_FLAGS_IDX1,      // startFlags
           &TCPIP_NETWORK_DEFAULT_MAC_DRIVER_IDX1,           // pMacObject
        },
    };
    qui est initialisé par ici

    Code:
    SYS_MODULE_OBJ TCPIP_STACK_Init()
    {
        TCPIP_STACK_INIT    tcpipInit;
    
        tcpipInit.moduleInit.sys.powerState = SYS_MODULE_POWER_RUN_FULL;
        //tcpipInit.pNetConf = TCPIP_HOSTS_CONFIGURATION;
        tcpipInit.pNetConf = TCPIP_HOSTS_CONFIGURATION_NEW;    
        tcpipInit.nNets = sizeof (TCPIP_HOSTS_CONFIGURATION) / sizeof (*TCPIP_HOSTS_CONFIGURATION);
        tcpipInit.pModConfig = TCPIP_STACK_MODULE_CONFIG_TBL;
        tcpipInit.nModules = sizeof (TCPIP_STACK_MODULE_CONFIG_TBL) / sizeof (*TCPIP_STACK_MODULE_CONFIG_TBL);
    
        return TCPIP_STACK_Initialize(0, &tcpipInit.moduleInit);
    mon problème, ce trouve à l'intermédiaire, c'est à dire mémoriser une chaine de caractère en flash interne pour la charger à l'initialisation

    non seulement je souhaite comprendre comment sauver en flash à l'aide de quel fonction.

    mais également sous quel forme, c'est à dire que je récupère bien ma nouvelle adresse ip modifier dans le buffer :httpDataBuff en faisant une boucle for je scan les caractères comme tel :

    0x31,0x39,0x32,0x2E,0x31,0x36, 0x38,0x2E,0x31,0x31, 0x33,0x35,0x00

    Une fois récupéré, comment les stocker en mémoire, comme tel ou je fais un tableau, genre

    de manière à récupérer en mémoire des décimal ipaddr[4]={192,168,1,135}

    Par contre après comment je balance ça dans rechargement de paramètre sachant que

    c'est sous cette forme "192.168.1.135" dans la fonction

    Code:
    {
    TCPIP_NETWORK_DEFAULT_INTERFACE_NAME_IDX1, // interface
    TCPIP_NETWORK_DEFAULT_HOST_NAME_IDX1, // hostName
    TCPIP_NETWORK_DEFAULT_MAC_ADDR_IDX1, // macAddr
    "192.168.1.136", // ipAddr 
    TCPIP_NETWORK_DEFAULT_IP_MASK_IDX1, // ipMask
    TCPIP_NETWORK_DEFAULT_GATEWAY_IDX1, // gateway
    TCPIP_NETWORK_DEFAULT_DNS_IDX1, // priDNS
    TCPIP_NETWORK_DEFAULT_SECOND_DNS_IDX1, // secondDNS
    TCPIP_NETWORK_DEFAULT_POWER_MODE_IDX1, // powerMode
    TCPIP_NETWORK_DEFAULT_INTERFACE_FLAGS_IDX1, // startFlags
    &TCPIP_NETWORK_DEFAULT_MAC_DRIVER_IDX1, // pMacObject
    },
    }
    Merci pour votre aide qui m'est de plus en plus précieuse au vue du temps qu'il me reste (:

    -----

  2. #2
    davidif

    Re : pic32mx795f512l mémoriser en flash

    j'ai donc réussi à comprendre comment ré-initialiser mes paramètres réseau au démarrage.

    Code:
    SYS_MODULE_OBJ TCPIP_STACK_Init()
    {
    
        TCPIP_STACK_INIT    tcpipInit;
        TCPIP_NETWORK_CONFIG networkConfig[1];
        
        tcpipInit.moduleInit.sys.powerState = SYS_MODULE_POWER_RUN_FULL;    
        
        //AppConfig.MyIPAddr.Val = new_ip[0] | new_ip[1]<<8ul | new_ip[2]<<16ul | new_ip[3]<<24ul;
    	//AppConfig.DefaultIPAddr.Val = AppConfig.MyIPAddr.Val;
    
        
        
        networkConfig[0].interface = TCPIP_NETWORK_DEFAULT_INTERFACE_NAME_IDX1;
        networkConfig[0].hostName =TCPIP_NETWORK_DEFAULT_HOST_NAME_IDX1;
        networkConfig[0].macAddr =TCPIP_NETWORK_DEFAULT_MAC_ADDR_IDX1;
        //networkConfig[0].ipAddr=TCPIP_NETWORK_DEFAULT_IP_ADDRESS_IDX1;
        networkConfig[0].ipAddr =new_ip;
        networkConfig[0].ipMask =TCPIP_NETWORK_DEFAULT_IP_MASK_IDX1;
        networkConfig[0].gateway = TCPIP_NETWORK_DEFAULT_GATEWAY_IDX1;
        networkConfig[0].priDNS = TCPIP_NETWORK_DEFAULT_DNS_IDX1;
        networkConfig[0].secondDNS =TCPIP_NETWORK_DEFAULT_SECOND_DNS_IDX1;
        networkConfig[0].powerMode =TCPIP_NETWORK_DEFAULT_POWER_MODE_IDX1;
        networkConfig[0].startFlags=TCPIP_NETWORK_DEFAULT_INTERFACE_FLAGS_IDX1;   
        networkConfig[0].pMacObject=&TCPIP_NETWORK_DEFAULT_MAC_DRIVER_IDX1;
    
    
        //networkConfig[0].startFlags = 0;
    
    
    
        //tcpipInit.pNetConf = TCPIP_HOSTS_CONFIGURATION; 
        //tcpipInit.nNets = sizeof (TCPIP_HOSTS_CONFIGURATION) / sizeof (*TCPIP_HOSTS_CONFIGURATION);
        tcpipInit.pNetConf = networkConfig;
        tcpipInit.nNets = sizeof (networkConfig) / sizeof (*networkConfig);
        tcpipInit.pModConfig = TCPIP_STACK_MODULE_CONFIG_TBL;
        tcpipInit.nModules = sizeof (TCPIP_STACK_MODULE_CONFIG_TBL) / sizeof (*TCPIP_STACK_MODULE_CONFIG_TBL);
    
        return TCPIP_STACK_Initialize(0, &tcpipInit.moduleInit);
    }
    avec

    char new_ip[13]={0x31,0x39,0x32,0x2E,0x31,0x3 6,0x38,0x2E,0x31,0x2E,0x31,0x3 3,0x38}; j'ai juste à rentrer ma nouvelle adresse

    networkConfig[0].ipAddr =new_ip;


    Evidemment mon tableau ce remplira lors d'une commande de modification de l'IP via l'interface web à ce niveau

    Code:
     if(!strcmp((char *)httpDataBuff, (const char *)"ip"))
            {
            tabIP=0;
            
            
                 for ( inc=6; inc<18; inc++) 
                 {     
                  new_ip[tabIP] = *( httpDataBuff+inc);
                  tabIP++;
                  }
            }
    Mon seul problème serait de mettre en flash directement donc cette fonction pour le relire au redémarrage.

    Pour mettre en flash, j'ai cette fonction pour l'écriture

    Code:
    void DRV_NVM_EraseWrite
    (
        const DRV_HANDLE handle,
        DRV_NVM_COMMAND_HANDLE * commandHandle,
        void * sourceBuffer,
        uint32_t writeBlockStart,
        uint32_t nWriteBlock
    )

    puis celle-ci pour lire :

    Code:
    void DRV_NVM_Read
    (
        const DRV_HANDLE handle,
        DRV_NVM_COMMAND_HANDLE * commandHandle,
        void * targetBuffer,
        uint32_t blockStart,
        uint32_t nBlock
    )
    Seulement, j'ai lu la doc harmony et d'autres explication des forums et j'avoue avoir du mal à comprendre comment les utiliser pour sauvegarder un tableau de 13 caractères.

    J'ai regardé également, le code en exemple d'harmony, seulement il y a beaucoup de choses et sauf erreur, je pense pas à avoir besoin de tous implémenter mais quoi prendre ?

    Quelqu'un pourrai m'éclairer ?

    merci

  3. #3
    satinas

    Re : pic32mx795f512l mémoriser en flash

    Quand j'avais regardé les bootloaders, j'utilisais NVmem.c qui permet d'effacer et écrire un mot ou un bloc à une adresse déterminée de la flash.
    Tu pourras peut-être l'intégrer, bien que passer par Harmony serait plus propre.
    https://github.com/gbraad/dangerous-...Source/NVMem.c

  4. #4
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    Quand j'avais regardé les bootloaders, j'utilisais NVmem.c qui permet d'effacer et écrire un mot ou un bloc à une adresse déterminée de la flash.
    Tu pourras peut-être l'intégrer, bien que passer par Harmony serait plus propre.
    https://github.com/gbraad/dangerous-...Source/NVMem.c
    Merci je vais voir si ça passe , sous harmony j'ai essayé seulement il doit y avoir quelque choses qui m'échappe car pour l'instant ça ne marche pas et sous harmony il m'a généré le code d'init et créer une dossier nvm dynamique et non statique.

    Faut que je m'y remette, car à force d'essayer j'en es eu un peu marre et je me suis mis sur une autre fonction comme le lcd qui maintenant fonctionne correctement.

    Merci satinas, je mis remet (:

  5. A voir en vidéo sur Futura
  6. #5
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    Quand j'avais regardé les bootloaders, j'utilisais NVmem.c qui permet d'effacer et écrire un mot ou un bloc à une adresse déterminée de la flash.
    Tu pourras peut-être l'intégrer, bien que passer par Harmony serait plus propre.
    https://github.com/gbraad/dangerous-...Source/NVMem.c
    Après j'ai les fonction qui permettent d'écrire et de lire en mémoire en poste 2 , c'est seulement que je ne sais pas m'en servir, par exemple pour l'écriture il est donc recommander d'effacer d'abord puis d'écrire ce qui est fait avec cette fonction

    DRV_NVM_EraseWrite

    Dont le drv_nvm.h nous dit :

    Code:
    // *****************************************************************************
    /* Function:
        void DRV_NVM_EraseWrite
        (
            const DRV_HANDLE handle,
            DRV_NVM_COMMAND_HANDLE * commandHandle,
            void * sourceBuffer,
            uint32_t writeBlockStart,
            uint32_t nWriteBlock
        );
    
      Summary:
        Erase and Write blocks of data starting from a specified address in flash
        memory.
    
      Description:
        This function combines the step of erasing a page and then writing the row.
        The application can use this function if it wants to avoid having to
        explicitly delete a page in order to update the rows contained in the page. 
    
        This function schedules a non-blocking operation to erase and write blocks
        of data into flash memory. The function returns with a valid buffer handle
        in the commandHandle argument if the write request was scheduled successfully.
        The function adds the request to the hardware instance queue and returns 
        immediately. While the request is in the queue, the application buffer is 
        owned by the driver and should not be modified. The function returns 
        DRV_NVM_COMMAND_HANDLE_INVALID in the commandHandle argument under the 
        following circumstances:
        - if a buffer could not be allocated to the request
        - if the input buffer pointer is NULL
        - if the client opened the driver for read only
        - if the buffer size is 0 
        - if the write queue size is full or queue depth is insufficient
        - if the driver handle is invalid 
    
        If the requesting client registered an event callback with the driver, the
        driver will issue a DRV_NVM_EVENT_COMMAND_COMPLETE event if the buffer
        was processed successfully or DRV_NVM_EVENT_COMMAND_ERROR event if 
        the buffer was not processed successfully.
    
      Precondition:
        The DRV_NVM_Initialize() routine must have been called for the specified
        NVM driver instance.
    
        The DRV_NVM_Open() must have been called with DRV_IO_INTENT_WRITE or 
        DRV_IO_INTENT_READWRITE as a parameter to obtain a valid opened device handle.
    
      Parameters:
        handle        - A valid open-instance handle, returned from the driver's
                        open function
    
        commandHandle - Pointer to an argument that will contain the return buffer
                        handle. If NULL, then buffer handle is not returned.
                       
        sourceBuffer  - The source buffer containing data to be programmed into NVM
                        Flash
    
        writeBlockStart - Start block address of NVM Flash where the write should begin.
                        This address should be aligned on a DRV_NVM_ROW_SIZE byte 
                        boundary.
    
        nWriteBlock   - Total number of blocks to be written. 
    
      Returns:
        The buffer handle is returned in the commandHandle argument. It Will be
        DRV_NVM_COMMAND_HANDLE_INVALID if the request was not queued.

  7. #6
    satinas

    Wink Re : pic32mx795f512l mémoriser en flash

    toujours la même réponse
    findstr /s /cRV_NVM_Open *.c

    une ligne retournée intéressante car elle ouvre le fameux handle
    nvmHandle = DRV_NVM_Open(0, DRV_IO_INTENT_READWRITE);

    elle est dans le fichier :
    C:\Microchip\harmony\v1_07_01\ framework\driver\wifi\mrf24wn\ wireless_driver\wdrv_mrf24wn_c onfig_data.c

    dans ce source, il ouvre un handle de session d'accès à la flash, il lit, efface, écrit, avec des boucles (bloquantes !) d'attente, puis ferme le handle.
    de la méthode, de la méthode ...

  8. #7
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    toujours la même réponse
    findstr /s /cRV_NVM_Open *.c

    une ligne retournée intéressante car elle ouvre le fameux handle
    nvmHandle = DRV_NVM_Open(0, DRV_IO_INTENT_READWRITE);

    elle est dans le fichier :
    C:\Microchip\harmony\v1_07_01\ framework\driver\wifi\mrf24wn\ wireless_driver\wdrv_mrf24wn_c onfig_data.c

    dans ce source, il ouvre un handle de session d'accès à la flash, il lit, efface, écrit, avec des boucles (bloquantes !) d'attente, puis ferme le handle.
    de la méthode, de la méthode ...
    Oui je sais la méthode c'est ce qui me manque, n'étant pas programmeur à la base, c'est ça qui m'handicap et qui fait que je ne percute pas tout de suite sur des évidence (:

    j'ai effectivement vu qu'il fallait ouvrir le handle

    Code:
    void save_tcpip (void)
    {
        
    //    uint8_t myBuffer[16];
        
        // address should be block aligned.
       // uint32_t blockStart = NVM_BASE_ADDRESS_TO_WRITE_TO;
        uint32_t    nBlock = 2;
        DRV_NVM_COMMAND_HANDLE commandHandle;
        //MY_APP_OBJ myAppObj;    
          
        DRV_HANDLE handle;
        
        
        void APP_NVMEventHandler(DRV_NVM_EVENT event,DRV_NVM_COMMAND_HANDLE commandHandle, uintptr_t contextHandle)
        {
            // contextHandle points to myAppObj.
    
            switch(event)
            {
                case DRV_NVM_EVENT_COMMAND_COMPLETE:
    
                    // This means the data was transferred. 
                    break;
                
                case DRV_NVM_EVENT_COMMAND_ERROR:
    
                    // Error handling here.
                    break;
    
                default:
                    break;
            }
        }
        
        handle = DRV_NVM_Open(DRV_NVM_INDEX_0, DRV_IO_INTENT_EXCLUSIVE);
        // myNVMHandle is the handle returned 
        // by the DRV_NVM_Open function.
        
        // Client registers an event handler with driver
    
        //DRV_NVM_EventHandlerSet(handle, APP_NVMEventHandler, (uintptr_t)&myAppObj);
        DRV_NVM_EventHandlerSet(handle, APP_NVMEventHandler,0);
    
        DRV_NVM_EraseWrite(handle, &commandHandle, &appDataTCPIP.new_IP, DRV_NVM_MEDIA_START_ADDRESS, nBlock);    
        
        
        
    }
    Maintenant je sais pas si ça fonctionne correctement car pour ça il faudrait pouvoir lire la mémoire, a moins qu'il y est une autre façon de voir si c'est bien en flash...

    Est-ce la flash ici

    Nom : FLASH.jpg
Affichages : 123
Taille : 154,1 Ko

  9. #8
    satinas

    Re : pic32mx795f512l mémoriser en flash

    Ce que tu me donnes est différent du fichier que je t'ai cité. Dans ce fichier, il lit ou écrit (comme toi) un buffer en indiquant son adresse et sa taille. D'autres fonctions se chargent de calculer le nombre de blocs de 2048 octets à écrire. L'adresse d'écriture est exprimée sous la forme d'un index, celui du premier bloc à écrire.
    je n'en sais pas plus que le contenu de ce fichier.

  10. #9
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    Ce que tu me donnes est différent du fichier que je t'ai cité. Dans ce fichier, il lit ou écrit (comme toi) un buffer en indiquant son adresse et sa taille. D'autres fonctions se chargent de calculer le nombre de blocs de 2048 octets à écrire. L'adresse d'écriture est exprimée sous la forme d'un index, celui du premier bloc à écrire.
    je n'en sais pas plus que le contenu de ce fichier.
    Oui je suis en train de l'examiner, je te montrais simplement ce que j'avais fais avant que tu m'envois le fichier ou effectivement j'ouvre le handle.
    Par contre, je me demandai comment vérifier d'avoir bien écrit en flash sans avoir à implémenter la fonction de lecture.

    dans mon interface mplab, j'ai un tableau "Data memory" puis-je à ton avis le voir là ?

  11. #10
    satinas

    Re : pic32mx795f512l mémoriser en flash

    essaye de quoter à bon escient.
    comment vérifier d'avoir bien écrit en flash sans avoir à implémenter la fonction de lecture ? en analysant le contenu du fichier !
    pour le "Data memory", j'ai pas compris.

  12. #11
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    essaye de quoter à bon escient.
    comment vérifier d'avoir bien écrit en flash sans avoir à implémenter la fonction de lecture ? en analysant le contenu du fichier !
    pour le "Data memory", j'ai pas compris.
    excuse moi, mais de quel fichier à analyser parles tu ?
    Je parle de l'onglet "Data memory" dans mplab comme désigné sur l'image poste 7.

    Merci pour ton aide

  13. #12
    satinas

    Re : pic32mx795f512l mémoriser en flash

    l'unique fichier .c que je t'ai cité, et qui contient tout ce que tu cherches. Les "while () ;" sont bloquants, mais tu peux rajouter un time-out pour interrompre si problème.
    Pour l'écriture, tu auras l'info "write completed", cela veut-il dire qu'il a fait un verify implicite, je sais pas, il vaut mieux que tu fasses toi même une lecture derrière pour être sur de ton coup.
    Tu as la possibilité de suivre au debugger pour voir ce qu'il y a dans la structure geometry de la flash, pour comprendre les index, les adresses, les taille de blocs, car vu de l'extérieur il y a largement de quoi s'y perdre. En fait il n'écrit qu'un bloc max, pas plusieurs.
    Le data memory, je sais pas, c'est toi qui utilise MPLABX, pas moi

  14. #13
    satinas

    Re : pic32mx795f512l mémoriser en flash

    celui-là
    C:\Microchip\harmony\v1_07_01\ framework\driver\wifi\mrf24wn\ wireless_driver\wdrv_mrf24wn_c onfig_data.c

    WDRV_NVM_write(my_tableau, size);
    WDRV_NVM_read(my_tableau, size);

    Le seul problème est lorsqu'il faudra mettre l'adresse d'écriture de la flash (variable tmp), et là cogite et éventuellement tatonne ...

  15. #14
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    celui-là
    C:\Microchip\harmony\v1_07_01\ framework\driver\wifi\mrf24wn\ wireless_driver\wdrv_mrf24wn_c onfig_data.c

    WDRV_NVM_write(my_tableau, size);
    WDRV_NVM_read(my_tableau, size);

    Le seul problème est lorsqu'il faudra mettre l'adresse d'écriture de la flash (variable tmp), et là cogite et éventuellement tatonne ...
    Merci j'essaierai dès demain car là je sature (:

  16. #15
    satinas

    Re : pic32mx795f512l mémoriser en flash

    tu mets dans un fichier les 2 fonctions ci-dessus.
    l'adresse où on écrit dans la flash, de 0 à 512k, est à mettre dans WDRV_NVM_SPACE_ADDR
    ne pas dépasser 512 octets pour size car la flash s'écrit par bloc de 512 octets max.
    elle s'efface par bloc de 4096 octets
    dans la fonction WDRV_NVM_write() il commence par faire un read, je vois pas pourquoi.

  17. #16
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    tu mets dans un fichier les 2 fonctions ci-dessus.
    l'adresse où on écrit dans la flash, de 0 à 512k, est à mettre dans WDRV_NVM_SPACE_ADDR
    ne pas dépasser 512 octets pour size car la flash s'écrit par bloc de 512 octets max.
    elle s'efface par bloc de 4096 octets
    dans la fonction WDRV_NVM_write() il commence par faire un read, je vois pas pourquoi.

    Bon, j'ai donc copier les fonctions dans un fichier NVMen.c

    Code:
    #include <xc.h>
    #include "save_data.h"
    
    
    
    
    
    #include "wdrv_mrf24wn_main.h"
    
    
    typedef struct
    {
    uint8_t new_IP[13];
    uint8_t new_MASK[13];
    uint8_t new_GATEWAY[13];
    
    } APP_DATA_TCPIP;
    
    
    #define WDRV_NVM_SPACE_MAGIC_NUMBER 0x5a5a5a5a
    #define WDRV_NVM_SPACE_ADDR 256
    
    //static WDRV_CONFIG_DATA s_configData;
    //WDRV_CONFIG_DATA *p_wdrv_configData = &s_configData;
    
    //static void WriteConfigToMemory(void);
    //static void ReadConfigFromMemory(void);
    //static void EraseConfigFromMemory(void);
    
    //#if defined(WDRV_NVM_SPACE_ENABLE)
    uint8_t __attribute__((coherent)) NVM_DATA_BUFF_local[DRV_NVM_ROW_SIZE];
    SYS_FS_MEDIA_GEOMETRY *gAppNVMMediaGeometry;
    
    bool WDRV_NVM_write(uint8_t *buf, int size)
    {
        int i, tmp;
        DRV_HANDLE nvmHandle;
        DRV_NVM_COMMAND_HANDLE nvmCommandHandle;
        uint8_t NVM_DATA_READ_BUFF_local[DRV_NVM_ROW_SIZE];
    
        if (size > DRV_NVM_ROW_SIZE) {
            return false;
        }
    
        for (i = 0; i < size; i++)
            NVM_DATA_BUFF_local[i] = buf[i];
    
        nvmHandle = DRV_NVM_Open(0, DRV_IO_INTENT_READWRITE);
        if (DRV_HANDLE_INVALID == nvmHandle) {
            return false;
        }
    
        gAppNVMMediaGeometry = DRV_NVM_GeometryGet(nvmHandle);
        if (NULL == gAppNVMMediaGeometry) {
            return false;
        }
    
        DRV_NVM_Read (nvmHandle, &nvmCommandHandle, NVM_DATA_READ_BUFF_local, WDRV_NVM_SPACE_ADDR, DRV_NVM_ROW_SIZE);
        if (DRV_NVM_COMMAND_HANDLE_INVALID == nvmCommandHandle) {
            return false;;
        }
    
        tmp = WDRV_NVM_SPACE_ADDR * (gAppNVMMediaGeometry->geometryTable[2].numBlocks) / (DRV_NVM_MEDIA_SIZE * 1024);
        DRV_NVM_Erase(nvmHandle, &nvmCommandHandle,  tmp, 1);
        if (nvmCommandHandle == DRV_NVM_COMMAND_HANDLE_INVALID) {
            return false;;
        }
    
        while (DRV_NVM_COMMAND_COMPLETED != DRV_NVM_CommandStatus(nvmHandle, nvmCommandHandle))
            ;
    
        tmp = WDRV_NVM_SPACE_ADDR * (gAppNVMMediaGeometry->geometryTable[1].numBlocks) / (DRV_NVM_MEDIA_SIZE * 1024);
        DRV_NVM_Write(nvmHandle, &nvmCommandHandle, (uint8_t *)NVM_DATA_BUFF_local, tmp, 1);
        if (DRV_NVM_COMMAND_HANDLE_INVALID == nvmCommandHandle) {
            return false;;
        }
    
        while (DRV_NVM_COMMAND_COMPLETED != DRV_NVM_CommandStatus(nvmHandle, nvmCommandHandle))
            ;
    
        DRV_NVM_Close(nvmHandle);
    
        return true;
    }
    
    bool WDRV_NVM_read(uint8_t *buf, int size)
    {
        DRV_HANDLE nvmHandle;
        DRV_NVM_COMMAND_HANDLE nvmCommandHandle;
    
        if (size > DRV_NVM_PAGE_SIZE) {
            return false;
        }
    
        nvmHandle = DRV_NVM_Open(0, DRV_IO_INTENT_READWRITE);
        if (DRV_HANDLE_INVALID == nvmHandle) {
            return false;
        }
    
        gAppNVMMediaGeometry = DRV_NVM_GeometryGet(nvmHandle);
        if (NULL == gAppNVMMediaGeometry) {
            return false;
        }
    
        DRV_NVM_Read(nvmHandle, &nvmCommandHandle, buf, WDRV_NVM_SPACE_ADDR, size);
        if (DRV_NVM_COMMAND_HANDLE_INVALID == nvmCommandHandle) {
            return false;
        }
    
        while (DRV_NVM_COMMAND_COMPLETED != DRV_NVM_CommandStatus(nvmHandle, nvmCommandHandle))
            ;
    
        DRV_NVM_Close(nvmHandle);
    
        return true;
    }
    
    bool WDRV_NVM_erase(void)
    {
        int tmp;
        DRV_HANDLE nvmHandle;
        DRV_NVM_COMMAND_HANDLE nvmCommandHandle;
        uint8_t NVM_DATA_READ_BUFF_local[DRV_NVM_ROW_SIZE];
    
        nvmHandle = DRV_NVM_Open(0, DRV_IO_INTENT_READWRITE);
        if (DRV_HANDLE_INVALID == nvmHandle) {
            return false;
        }
    
        gAppNVMMediaGeometry = DRV_NVM_GeometryGet(nvmHandle);
        if (NULL == gAppNVMMediaGeometry) {
            return false;
        }
    
        DRV_NVM_Read(nvmHandle, &nvmCommandHandle, NVM_DATA_READ_BUFF_local, WDRV_NVM_SPACE_ADDR, DRV_NVM_ROW_SIZE);
        if (DRV_NVM_COMMAND_HANDLE_INVALID == nvmCommandHandle) {
            return false;;
        }
    
        tmp = WDRV_NVM_SPACE_ADDR * (gAppNVMMediaGeometry->geometryTable[2].numBlocks) / (DRV_NVM_MEDIA_SIZE * 1024);
        DRV_NVM_Erase(nvmHandle, &nvmCommandHandle,  tmp, 1);
        if (nvmCommandHandle == DRV_NVM_COMMAND_HANDLE_INVALID) {
            return false;;
        }
    
        while (DRV_NVM_COMMAND_COMPLETED != DRV_NVM_CommandStatus(nvmHandle, nvmCommandHandle))
            ;
    
        DRV_NVM_Close(nvmHandle);
    
        return true;
    }

    après quelques réglage pour que ça ce compile, j'ai donc posé la fonction :

    WDRV_NVM_write(appDataTCPIP.ne w_IP,13);


    puis à l'init :

    WDRV_NVM_read(appDataTCPIP.new _IP,13);



    Quand je charge donc mon tableau qui à l'origine ce charge comme ça

    networkConfig[0].ipAddr = new_ip;

    là je fais donc

    networkConfig[0].ipAddr = appDataTCPIP.new_IP;

    j'ai ces erreur là

    Code:
    make[2]: Entering directory 'C:/Users/Tecwave/disque 1t/etude/hardware/Programme PIC32/WIFI/N V1.2/apps/tcpip/web_server_nvm_mpfs/firmware/pic32_eth_wifi_web_server.X'
    ../src/system_config/pic32mx_eth_sk+ioexp+11n+freertos/system_init.c: In function 'TCPIP_STACK_Init':
    ../src/system_config/pic32mx_eth_sk+ioexp+11n+freertos/system_init.c:788:29: error: pointer targets in assignment differ in signedness [-Werror=pointer-sign]
         networkConfig[0].ipAddr = appDataTCPIP.new_IP;
                                 ^
    cc1.exe: all warnings being treated as errors
    make[2]: *** [build/pic32mx_eth_sk+ioexp+11n+freertos/production/_ext/1922377806/system_init.o] Error 1
    make[1]: *** [.build-conf] Error 2
    make: *** [.build-impl] Error 2
    C'est pourtant un autre tableau de 13 caractère que je charge, à l'origine celui-ci ce charge bien

    char new_ip[13]={0x31,0x39,0x32,0x2E,0x31,0x3 6,0x38,0x2E,0x31,0x2E,0x31,0x3 3,0x38};

    donc pourquoi pas celui-ci

    appDataTCPIP.new_IP

  18. #17
    satinas

    Re : pic32mx795f512l mémoriser en flash

    Peux-tu me dire à quoi sert de reprendre le message précédent en entier dans une quote ?

    la fonction WDRV_NVM_erase() n'est pas utile
    l'adresse d'écriture doit être alignée sur 4096 octets, car c'est la taille de l'effacement préalable à toute écriture.

    error: pointer targets in assignment differ in signedness [-Werror=pointer-sign]
    networkConfig[0].ipAddr = appDataTCPIP.new_IP;
    de quel type est networkConfig[0].ipAddr ?
    de quel type est appDataTCPIP.new_IP ?
    si tu sais pas cherche ...

  19. #18
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    Peux-tu me dire à quoi sert de reprendre le message précédent en entier dans une quote ?

    la fonction WDRV_NVM_erase() n'est pas utile
    l'adresse d'écriture doit être alignée sur 4096 octets, car c'est la taille de l'effacement préalable à toute écriture.


    de quel type est networkConfig[0].ipAddr ?
    de quel type est appDataTCPIP.new_IP ?
    si tu sais pas cherche ...
    Bonjour Satinas

    En fait, si je dis pas de bêtises, networkConfig[0].ipAddr provient de cette structure

    Code:
    typedef struct
    {
         /* Pointer to the interface name; could be NULL. */
         /* Notes: Usually it's been one of the TCPIP_STACK_IF_NAME_xxx symbols: "ENCJ60", "ENCJ600", "97J60", "PIC32INT", "MRF24W", "MRF24WN" */
         /*        However, the TCP/IP stack will assign an alias names for each interface (eth0, wlan0, etc. see TCPIP_STACK_IF_NAME_ALIAS_xxx)
                   so this name is maintained for backward compatibility purposes only and will be eventually dropped.
                   The native name of the interface in the form TCPIP_STACK_IF_NAME_xxx is present in the MAC driver for that interface */ 
        /*         (see the "tcpip/tcpip_mac_object.h" definition of TCPIP_MAC_OBJECT_TYPE) */ 
         char*     interface;
    
         /* Valid Host name for this interface to use.  Ex: "MCHPBOARD" */
         char*     hostName;   
    
         /* MAC address to use for this interface.  Use "00:04:a3:00:00:00" or 0 for the factory preprogrammed address*/
         char*     macAddr;    
    
         /* Static IP address to use.  Ex: "169.254.1.1"*/
         char*     ipAddr;     
    
         /* Netmask to use. Ex: "255.255.0.0"*/
         char*     ipMask;
    
         /* Static Gateway to use. Ex: "169.254.1.1"*/
         char*     gateway;
    
         /* Primary DNS to use.  Ex: "169.254.1.1"*/
         char*     priDNS;
    
         /* Secondary DNS to use.  Use "0.0.0.0" for none */
         char*     secondDNS;  
    
         /* Power Mode to use.  Use TCPIP_STACK_IF_POWER_NONE, TCPIP_STACK_IF_POWER_FULL, TCPIP_STACK_IF_POWER_LOW, or TCPIP_STACK_IF_POWER_DOWN*/
         char*     powerMode; 
    
         /* flags for interface start-up */
         TCPIP_NETWORK_CONFIG_FLAGS   startFlags;
    
         /* Non-volatile pointer to the MAC driver object associated with this network interface */
         /* This is the MAC driver that this interface will use */
         /* Note: This object has to be valid for the whole life of the interface! */
         /*       The TCP/IP stack does not make a private copy of this object */
        const struct TCPIP_MAC_OBJECT_TYPE*    pMacObject;   
         
         /* static IPv6 address; only if TCPIP_NETWORK_CONFIG_IPV6_ADDRESS specified can be NULL if not needed*/
         char*     ipv6Addr;   
    
         /* subnet prefix length; only if TCPIP_NETWORK_CONFIG_IPV6_ADDRESS specified
            0 means default value (64)
            should probably always be 64 as requested by the RFC */
         int       ipv6PrefixLen;
    
         /* default IPv6 gateway address; only if TCPIP_NETWORK_CONFIG_IPV6_ADDRESS specified
            can be NULL if not needed*/
         char*     ipv6Gateway; 
    
    }TCPIP_NETWORK_CONFIG;
    qui est donc utilisé dans l'init des paramètres réseau

    Code:
        TCPIP_STACK_INIT    tcpipInit;
        TCPIP_NETWORK_CONFIG networkConfig[1];
    
        
        tcpipInit.moduleInit.sys.powerState = SYS_MODULE_POWER_RUN_FULL;    
        
        WDRV_NVM_read(appDataTCPIP.new_IP,13);
     
        
        //AppConfig.MyIPAddr.Val = new_ip[0] | new_ip[1]<<8ul | new_ip[2]<<16ul | new_ip[3]<<24ul;
    	//AppConfig.DefaultIPAddr.Val = AppConfig.MyIPAddr.Val;
    
        
        
        networkConfig[0].interface = TCPIP_NETWORK_DEFAULT_INTERFACE_NAME_IDX1;
        networkConfig[0].hostName =TCPIP_NETWORK_DEFAULT_HOST_NAME_IDX1;
        networkConfig[0].macAddr =TCPIP_NETWORK_DEFAULT_MAC_ADDR_IDX1;
        //networkConfig[0].ipAddr=TCPIP_NETWORK_DEFAULT_IP_ADDRESS_IDX1;
        //if (appDataTCPIP.new_IP) networkConfig[0].ipAddr =  appDataTCPIP.new_IP; else networkConfig[0].ipAddr = new_ip; 
        networkConfig[0].ipAddr = appDataTCPIP.new_IP;
        //networkConfig[0].ipAddr = new_ip;
        networkConfig[0].ipMask =TCPIP_NETWORK_DEFAULT_IP_MASK_IDX1;
        networkConfig[0].gateway = TCPIP_NETWORK_DEFAULT_GATEWAY_IDX1;
        networkConfig[0].priDNS = TCPIP_NETWORK_DEFAULT_DNS_IDX1;
        networkConfig[0].secondDNS =TCPIP_NETWORK_DEFAULT_SECOND_DNS_IDX1;
        networkConfig[0].powerMode =TCPIP_NETWORK_DEFAULT_POWER_MODE_IDX1;
        networkConfig[0].startFlags=TCPIP_NETWORK_DEFAULT_INTERFACE_FLAGS_IDX1;   
        networkConfig[0].pMacObject=&TCPIP_NETWORK_DEFAULT_MAC_DRIVER_IDX1;

    et appDataTCPIP.new_IP est un tableau de 13 caractères tout comme new_ip qui est bien pris en compte et est fonctionnelle.

    Donc l'idée, dans ma fonction init, serait donc de récupérer mon tableau"appDataTCPIP.new_IP" de 13 caractères (représente ma nouvelle ip) de le tester voir si celui-ci est bien rempli , donc tester ces éléments si ceux-ci ne sont pas égale à FF le prendre en compte comme nouvelle ip sinon reprendre l'ancienne ip "new_ip"

    Y a t-il des fonctions ou langage C permettant de faire ce test plus rapidement ou devrais-je faire cette fonction par le biais de boucles?

    Oui , je sais les noms de tableau ne sont pas trop parlant, c'est le fruit de multiple changement, je vais les modifier une fois fonctionnelle, c'est pour les essais.

  20. #19
    satinas

    Re : pic32mx795f512l mémoriser en flash

    Bonjour,
    tu as l'art de faire des réponses fleuves, en quotant à la louche, j'attendais 3 lignes, pas plus

    ok tu as trouvé que networkConfig[0].ipAddr est un char* et appDataTCPIP.new_IP est un uint8_t[13]
    char* est un pointeur sur des caractère signés, donc un pointeur vers des octet signés.
    uint8_t est un octet non signé.
    Ton niveau de warning/error est très élevé (et c'est très bien), il ne te permet pas de faire pointer ipAddr sur un tableau d'octets non signés. Il ne veut pointer que sur des octets signés.
    Le message était clair, et il faut faire un casting.

    Pour la validité de ton adresse ip lue dans la flash, il n'y a rien à faire sinon de lire derrière pour vérifier que l'écriture s'est bien passée. Si tu écris ta flash que très rarement, sa fiabilité n'a pas à être mise en cause.
    Tu peux aussi vérifier que ça démarre bien par "192" par exemple, cela suffira amplement. pour les fonctions C et les castings, voir les cours ...

  21. #20
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Effectivement, j'ai changé les type de uint8_t à char dans les fonction et variable et c'est bien pris en compte

    Maintenant reste à savoir si j'enregistre bien en mémoire ...

    et pour ça je suis donc obligé de démarrer avec une ip par défaut pour pouvoir faire une première connexion pour pouvoir la changer par la suite
    Donc comme dit précédemment, j'essai de faire une petite fonction de teste du tableau rempli par le contenu en mémoire d'une éventuelle ip modifié.

    Seulement là ou je croyais ça facile, je me heurte encore à mon compilateur très élever comme tu dis (:
    c'est à dire que sur une simple fonction comme celle-ci :

    Code:
    bool test_tableau(char tab[],char taille)
    {
    char i,j;
    
    
    
        for(i=0;i<taille;i++)  
        {
         //   if (tab[i]==0xFF) j=1; else j=0;
                  
        }
    
     return false;}
    à l’intérieur je déclare une première variable "i" , ok tout va bien... ensuite j'en déclare une autre donc "j" pour pouvoir faire ce que j'ai mis en test

    if (tab[i]==0xFF) j=1; else j=0;

    et là erreur, comme quoi je n'utilise pas "j" ???
    Alors que j'ai pu déclaré i sans l'avoir utilisé au départ...

    J'ai aussi pensé a faire ça , mais il n'en veut pas

    Code:
    bool test_tableau(char tab[],char taille)
    {
    char i;
    
    
    
        for(i=0;i<taille;i++)  
        {
            if (tab[i]==0xFF) return false;
                  
        }
    
    
    }

  22. #21
    satinas

    Re : pic32mx795f512l mémoriser en flash

    Dans le premier cas i est renseigné, au moins par le i=0; de la boucle.
    si taille est à 0 en entrée, ça sort aussitôt de la boucle, et j n'est pas renseigné.
    Le compilateur n'aime pas ça car si derrière la boucle, tu utilises j non renseignée, c'est crise de nerfs assurée.

    Dans le second cas, tab[i] est un char signé (tout ce qui n'est pas unsigned est signé). Il va de -128 à +127.
    Pas sur que le compilateur accepte de le remplir ou le comparer avec 0xFF (255). Tu as voulu éviter le casting et il revient aussitôt

    Quand tu auras compris que le signed et unsigned c'est pas la même chose, tu perdras moins de temps.
    Savoir caster c'est pas optionnel.
    Dernière modification par satinas ; 17/08/2016 à 13h17.

  23. #22
    satinas

    Re : pic32mx795f512l mémoriser en flash

    un indice de tableau de type char est souvent refusé (error: array subscript has type 'char')

  24. #23
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    Dans le premier cas i est renseigné, au moins par le i=0; de la boucle.
    si taille est à 0 en entrée, ça sort aussitôt de la boucle, et j n'est pas renseigné.
    Le compilateur n'aime pas ça car si derrière la boucle, tu utilises j non renseignée, c'est crise de nerfs assurée.

    Dans le second cas, tab[i] est un char signé (tout ce qui n'est pas unsigned est signé). Il va de -128 à +127.
    Pas sur que le compilateur accepte de le remplir ou le comparer avec 0xFF (255). Tu as voulu éviter le casting et il revient aussitôt

    Quand tu auras compris que le signed et unsigned c'est pas la même chose, tu perdras moins de temps.
    Savoir caster c'est pas optionnel.
    ok, pour voir, j'ai défini taille par un nombre et déclaré i,j en unsigned char mais j'ai toujours la même chose ?

    Code:
    "C:\Program Files (x86)\Microchip\xc32\v1.40\bin\xc32-gcc.exe" -g -x c -c -mprocessor=32MX795F512L -ffunction-sections -O1 "-DPLIB_INLINE=static inline" "-DPLIB_INLINE_API=static inline" -D__XC -I../src -I../src/system_config/pic32mx_eth_sk+ioexp+11n+freertos/framework -I../../../../../framework -I../../../../../framework/crypto -I../src/pic32mx_eth_sk+ioexp+11n+freertos -I../src/system_config/pic32mx_eth_sk+ioexp+11n+freertos -I../../../../../framework/driver/wifi/mrf24wn/include -I../../../../../framework/driver/wifi/mrf24wn/wireless_driver/include -I../../../../../framework/driver/wifi/mrf24wn/wireless_driver_extension -I../../../../../bsp/pic32mx_eth_sk -I../../../../../third_party/rtos/FreeRTOS/Source/portable/MPLAB/PIC32MX -I../../../../../third_party/rtos/FreeRTOS/Source/include -Werror -Wall -MMD -MF build/pic32mx_eth_sk+ioexp+11n+freertos/production/_ext/1360937237/Fonction.o.d -o build/pic32mx_eth_sk+ioexp+11n+freertos/production/_ext/1360937237/Fonction.o ../src/Fonction.c 
    nbproject/Makefile-pic32mx_eth_sk+ioexp+11n+freertos.mk:869: recipe for target 'build/pic32mx_eth_sk+ioexp+11n+freertos/production/_ext/1360937237/Fonction.o' failed
    ../src/Fonction.c: In function 'test_tableau':
    ../src/Fonction.c:44:17: error: variable 'j' set but not used [-Werror=unused-but-set-variable]
     unsigned char i,j;
                     ^
    cc1.exe: all warnings being treated as errors
    make[2]: *** [build/pic32mx_eth_sk+ioexp+11n+freertos/production/_ext/1360937237/Fonction.o] Error 1
    make[2]: *** Waiting for unfinished jobs....
    Après, je ne comprend pas ce que tu entend par "casting"

    Pour éviter de perdre du temps avec ma fonction, j'ai voulu faire autrement, surtout pour savoir si je récupère bien ma nouvelle ip en flash et j'ai donc fait ça dans mon fichier init pour commencer

    Code:
     WDRV_NVM_read(appDataTCPIP.new_IP,13);
    
    
        if (appDataTCPIP.new_IP[0]==0x31)
        {
            networkConfig[0].ipAddr = appDataTCPIP.new_IP;
        } 
        else 
        {
            networkConfig[0].ipAddr = defaut_ip;
        }
    Evidemment je démarre bien sur l'ip par defaut, seulement quand j'envoi ma nouvelle IP et que je reboot là plus rien.

  25. #24
    satinas

    Re : pic32mx795f512l mémoriser en flash

    error: variable 'j' set but not used
    Si tu comprends pas ce message d'erreur, c'est grave. Tu trouves peut être normal de rajouter de l'inutile, mais le compilateur et moi on n'aime pas ça, c'est comme ça

    Pour la flash, à quelle adresse as-tu écrit ?
    contente toi au démarrage de lire et afficher le contenu du premier octet, sur un afficheur ou une console série ou autre chose.

    Tu as fait en sorte dans ta config XC32 que tous les warnings soit aussi des erreurs, ce qui est quand même un peu brutal, essaie de modifier ça.
    Dernière modification par satinas ; 17/08/2016 à 14h12.

  26. #25
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    error: variable 'j' set but not used
    Si tu comprends pas ce message d'erreur, c'est grave. Tu trouves peut être normal de rajouter de l'inutile, mais le compilateur et moi on n'aime pas ça, c'est comme ça
    J'ai compris ce qu'il voulait dire, seulement je ne comprend pas pourquoi il me la met comme une erreur bloquante, une variable qui n'est pas utilisé n'est en général pas bloquante mais un warning et ce qui n’empêche pas de continuer .

    Citation Envoyé par satinas Voir le message
    Pour la flash, à quelle adresse as-tu écrit ?
    contente toi au démarrage de lire et afficher le contenu du premier octet, sur un afficheur ou une console série ou autre chose.
    Pour être honnête pour le moment je ne sais pas à quelle adresse il me met ma donnée, j'utilise les fonction d'écriture et de lecture tel quel

    Citation Envoyé par satinas Voir le message
    Tu as fait en sorte dans ta config XC32 que tous les warnings soit aussi des erreurs, ce qui est quand même un peu brutal, essaie de modifier ça.
    je n'ai rien touché au compilateur, c'est par défaut qu'il c'est configuré.

    Par contre, je dois avoir un autre problème lié à autre chose, malgré mes valeurs par défaut au démarrage car quand je reboot après avoir changer mon ip, ma pile ne redémarre pas, après extinction et rallumage.

    Ce qui est bizzare, c'est que mon server continu bien d'envoyer son IP d'origine et mac adresse.
    Dernière modification par davidif ; 17/08/2016 à 14h44.

  27. #26
    satinas

    Re : pic32mx795f512l mémoriser en flash

    Alors tu vas être obligé de programmer dans les règles de l'art, c'est bien ça.
    Pour le casting (ou cast) voir bouquins de programmation C. En théorie on en fait pas trop, mais pour les micro-contrôleurs, ça aide bien.

    En fait je sais pas quand tu écris, quand tu lis. Il y a de fortes chances que lorsque tu flashes le programme, toute la flash soit effacée, alors tes données elles sont plus là.
    Si tu sais pas ou tu écris, tu écris sans doute dans la zone où est stocké le programme, le programme il va beaucoup moins bien marcher forcément ...

  28. #27
    satinas

    Re : pic32mx795f512l mémoriser en flash

    D'après ce que j'ai compris, pour écrire dans les derniers 4096 octets de la flash de 512k, il faut écrire à l'index 0x7f000.
    Et il faut bien sur déclarer cette zone dans le linker script, pour éviter de l'effacer à la programmation.

  29. #28
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Merci beaucoup pour ton implication dans mon problème,

    Effectivement, ce doit être le cas, je dois écrire dans un mauvais emplacement, il faut que je creuse plus de ce côté là

    Pour pouvoir voir la valeur récupérer dans la flash je vais devoir l'afficher sur mon lcd dont je n'ai pas fini de coder, encore du boulot (: ....

  30. #29
    davidif

    Re : pic32mx795f512l mémoriser en flash

    Citation Envoyé par satinas Voir le message
    D'après ce que j'ai compris, pour écrire dans les derniers 4096 octets de la flash de 512k, il faut écrire à l'index 0x7f000.
    Et il faut bien sur déclarer cette zone dans le linker script, pour éviter de l'effacer à la programmation.
    En fait, le programme source sur lequel je travail, ne fait pas apparaître le linker, d'ailleurs quand je le rajoute au projet, j'ai des problèmes de compilation alors que si je le retire pas de problème , c'est pour ça je ne sais pas trop comment il organise ça mémoire, mais bon je vais devoir approfondir

  31. #30
    davidif

    Re : pic32mx795f512l mémoriser en flash

    quand je tente d'ajouter mon fichier linker "procdefs.ld"

    en le compilant, j'ai ces erreur là

    Code:
     Link Warning: absolute section '_0456948057b4841c' crosses the boundary of region kseg0_program_mem.
     Link Error: Could not allocate section '_0456948057b4841c' at 0x9d000000
     Link Error: Could not allocate program memory
    collect2.exe: error: ld returned 255 exit status
    make[2]: *** [dist/pic32mx_eth_sk+ioexp+11n+freertos/production/pic32_eth_wifi_web_server.X.production.hex] Error 255
    make[1]: *** [.build-conf] Error 2
    make: *** [.build-impl] Error 2
    nbproject/Makefile-pic32mx_eth_sk+ioexp+11n+freertos.mk:1515: recipe for target 'dist/pic32mx_eth_sk+ioexp+11n+freertos/production/pic32_eth_wifi_web_server.X.production.hex' failed
    make[2]: Leaving directory 'C:/Users/Tecwave/disque 1t/etude/hardware/Programme PIC32/WIFI/N V1.2/apps/tcpip/web_server_nvm_mpfs/firmware/pic32_eth_wifi_web_server.X'
    nbproject/Makefile-pic32mx_eth_sk+ioexp+11n+freertos.mk:78: recipe for target '.build-conf' failed
    make[1]: Leaving directory 'C:/Users/Tecwave/disque 1t/etude/hardware/Programme PIC32/WIFI/N V1.2/apps/tcpip/web_server_nvm_mpfs/firmware/pic32_eth_wifi_web_server.X'
    nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
    
    BUILD FAILED (exit value 2, total time: 14s)
    et une partie du linker, qu'en penses tu ?

    Code:
    EXTERN (_min_stack_size _min_heap_size)
    PROVIDE(_min_stack_size = 0x400) ;
    PROVIDE(_min_heap_size = 0) ; /*Defined on the command line */
    /*************************************************************************
     * Processor-specific object file.  Contains SFR definitions.
     *************************************************************************/
    INPUT("processor.o")
    
    /*************************************************************************
     * Processor-specific peripheral libraries are optional
     *************************************************************************/
    OPTIONAL("libmchp_peripheral.a")
    OPTIONAL("libmchp_peripheral_32MX795F512L.a")
    
    _ramfunc_begin = 0;
    
    /*************************************************************************
     * For interrupt vector handling
     *************************************************************************/
    PROVIDE(_vector_spacing = 0x00000001);
    _ebase_address  = 0x9D006000;
    
    /*************************************************************************
     * Memory Address Equates
     *************************************************************************/
    _RESET_ADDR              = (0x9D006000 + 0x1000 + 0x970);
    _BEV_EXCPT_ADDR          = (0x9D006000 + 0x1000 + 0x970 + 0x380);
    _DBG_EXCPT_ADDR          = (0x9D006000 + 0x1000 + 0x970 + 0x480);
    _DBG_CODE_ADDR           = 0xBFC02000;
    _DBG_CODE_SIZE           = 0xFF0     ;
    _GEN_EXCPT_ADDR          = _ebase_address + 0x180;
    
    /*************************************************************************
     * Memory Regions
     *
     * Memory regions without attributes cannot be used for orphaned sections.
     * Only sections specifically assigned to these regions can be allocated
     * into these regions.
     *************************************************************************/
    MEMORY
    {
      Flash_memory               : ORIGIN = 0x9D070000, LENGTH = 10000
      kseg0_program_mem    (rx)  : ORIGIN = (0x9D006000 + 0x1000 + 0x970 + 0x490), 	LENGTH = (0x80000 - 0x6000 - 0x1000 - 0x970 - 0x490-0x10000)
      kseg0_boot_mem             : ORIGIN = (0x9D006000 + 0x1000), 					LENGTH = 0x970
      exception_mem              : ORIGIN =  0x9D006000, 							LENGTH = 0x1000 /* Dummy IVT to fool the linker. This code uses no ISR*/
      kseg1_boot_mem             : ORIGIN = (0x9D006000 + 0x1000 + 0x970), 			LENGTH = 0x490
      debug_exec_mem             : ORIGIN = 0xBFC02000, LENGTH = 0xFF0
      config3                    : ORIGIN = 0xBFC02FF0, LENGTH = 0x4
      config2                    : ORIGIN = 0xBFC02FF4, LENGTH = 0x4
      config1                    : ORIGIN = 0xBFC02FF8, LENGTH = 0x4
      config0                    : ORIGIN = 0xBFC02FFC, LENGTH = 0x4
      kseg1_data_mem       (w!x) : ORIGIN = 0xA0000000, LENGTH = 0x18000
      sfrs                       : ORIGIN = 0xBF800000, LENGTH = 0x10000
      configsfrs                 : ORIGIN = 0xBFC02FF0, LENGTH = 0x10
    }

Page 1 sur 6 12 3 4 5 DernièreDernière

Discussions similaires

  1. programmation d'un pic32mx795f512l
    Par davidif dans le forum Électronique
    Réponses: 0
    Dernier message: 24/03/2015, 17h39
  2. programmation d'un pic32mx795f512l
    Par davidif dans le forum Électronique
    Réponses: 22
    Dernier message: 02/03/2015, 14h17
  3. bootloader pic32MX795F512L
    Par davidif dans le forum Électronique
    Réponses: 37
    Dernier message: 06/12/2013, 10h21
  4. TCP/IP sur PIC32MX795F512L
    Par invite3bb6cfa9 dans le forum Électronique
    Réponses: 2
    Dernier message: 13/02/2012, 22h58
Découvrez nos comparatifs produits sur l'informatique et les technologies.