1. Quelle est la taille de ton programme si tu le compiles avec le linker script par défaut ?
2. Enlève le -0x10000 dans le linker script modifié et vois ce que cela donne
-----
1. Quelle est la taille de ton programme si tu le compiles avec le linker script par défaut ?
2. Enlève le -0x10000 dans le linker script modifié et vois ce que cela donne
Il faut aussi enlever la ligne Flash_memory, qui d'ailleurs comportait une erreur (pas très grave), 10000 au lieu de 0x10000
Pour la taille du programme, tu le voie à la taille du fichier de sortie .hex ? ou sur mplab
TAILLE.png
j'ai retiré la ligne flash_memory et le compilateur apparemment n'aime pas ça
erreur.jpg
sinon, si je remet donc la ligne flash_memorie et
je change dans mon fichier system_conf.h
//#define DRV_NVM_MEDIA_START_ADDRESS 0x9D000000
#define DRV_NVM_MEDIA_START_ADDRESS 0x9D070000
voila le retour de compile
erreur1.jpg
d'après ce que je vois , il n'y aurait pas asser de place pour
heap et stack
mes paramètres du fichier "system_config"
Regarde la vidéo en minute 15, en bas à gauche. Mplabx comme Mplab affiche sous forme graphique l'occupation flash et ram.
la ligne Flash_memory a été ajoutée pour écrire des données en flash, qui a fait ça ? il faut faire l'opération inverse pour les essais.
De toute façon, tu dois utiliser des linker scripts issus d'Harmony, car j'ai bien peur qu'il soient différents des anciens. Et ne me pousse pas dans Harmony, je reste au bord résolument. Si les anciens scripts ne sont pas compatibles je peux rien faire de plus.
De quel video parles tu ? le lien youtube que tu as mis dans les premiers postes
oui, celle fourni en lien.
Il faut que tu détailles ce que tu fais, où as tu pris le script, l'as-tu modifié, et si possible sans balancer au milieu des explications des fichiers interminables qui donnent pas envie de te lire, fournis les sous forme d'un zip ou autre, pour aller les voir uniquement si on est intéressés.
Et surtout tu changes de sujet trop vite, on en a pas fini avec l'écriture de la flash, et on a est déjà parti dans le bootloader qui n'est pas une mince affaire.
Désolé pour les fichiers qui paraissent interminable, j'essai de mettre tout ce qui peut apporter l'information que je ne trouve pas forcement du fait de mon inexpérience du domaine.oui, celle fourni en lien.
Il faut que tu détailles ce que tu fais, où as tu pris le script, l'as-tu modifié, et si possible sans balancer au milieu des explications des fichiers interminables qui donnent pas envie de te lire, fournis les sous forme d'un zip ou autre, pour aller les voir uniquement si on est intéressés.
Mais je n'ai rien changé au script, enfin tu parle du linker ? ou autre .
Par ce que, ma compile passe bien sans le linker et d'ailleurs comment s'organise la mémoire sans linker ?
je comprend pas trop là
tDepuis hier j'ai écrit plusieurs fois "linker script par défaut". Il fallait me demander qu'est ce que c'est ce truc, parce qu'il y a forcément un linker script par défaut, tu ne pas encore trouvé, je pense. Je sais toujours pas où tu as trouvé celui que tu affiches.
Désolé, mais on a vraiment l'impression que tu as oublié (et pas relu !) ce qu'il ta été expliqué il y a 3 ans sur les bootloaders.
Bah quand tu me dis "linker script", je comprend qu'il s'agit du linker, mais quand tu me parle de "script" je me demandais de quoi il s'agit , il peut y avoir différents script autre ...
Par contre, ce linker que j'ai afficher n'est pas celui par defaut mais un linker récupéré d'un autre soft que j'ai fais avec évidemment le même micro et qui fonctionnait notamment en bootloader.
Dernière modification par davidif ; 17/08/2016 à 21h00.
Il vaut mieux en rester à l'écriture de la flash, car le bootloader, c'est très mal barré.
Pour le moment, je visais plus la lecture et ecriture, après si mon fichier fonctionnait ça faisant d'une pierre deux coup.
je vais continuer à approndire l'écriture et la lecture, seulement j'essai de comprendre ou j'ecris surtout
Relis mes messages, je te l'ai expliqué, où écrire et comment.
excuse moi, mais je ne comprend pas, ou faut-il écrire 0x7f000 (quel index) et le déclarer dans le script linker, seulement je ne peux pas pour le moment compiler le linker
On ne parle plus du tout de linker script.
Pour le moment, tu écris puis vérifie par lecture, dans le même programme, et tout sera effacé (par le linker script par défaut) à chaque fois que tu reprogrammera la flash.
L'adresse, c'est plutôt un index de 0 à 0x7f000, tu prends 0x7f000 pour écrire à la fin de la flash. Et j'ai pas vérifié expérimentalement alors c'est peut être ça.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
De toute façon tu peux déjà testé la lecture de la flash, en lisant un morceau du programme qu'elle contient, et en la comparant au listing désassemblé dans MPLABX, mais j'ai bien peut que là, ton cerveau va fumer
ok merci pour la précision, je vois ça
mon cerveau fume depuis un bon bout de temps malgré ça je suis arrivé à faire la majeur partie des fonctions, il me reste plus que celle-ci ( écriture,lecture) pour clore le tout .
Bonjour,
après quelques essai et modif, ça fonctionne après changement d'adresse
#define WDRV_NVM_SPACE_ADDR 0x9D070000
Alors prudence, quand je dis ça fonctionne, c'est que ma pile tcpip, ne plante pas après redémarrage, ce qui veut dire que je n'écris pas sur le prog
Par contre, mon changement d'ip ne ce fait toujours pas
Au changement, ip je viens écrire :
WDRV_NVM_write(appDataTCPIP.ne w_IP,13); // apriori ça à l'aire d'écrire, puisque ça plantais au début
puis à l'init, je viens donc relire
WDRV_NVM_read(appDataTCPIP.new _IP,13);
puis un test pour charger la nouvelle
seulement , apparemment, l'emplacement mémoire doit resté tout le temps à 0 malgré le changement car je reste toujours sur l'ancienne adresseCode:if (appDataTCPIP.new_IP[0]!=0x0) { networkConfig[0].ipAddr = appDataTCPIP.new_IP; } else { networkConfig[0].ipAddr = defaut_ip; }
Tu affiches d'abord le listing désassemblé de ton programme par
le menu Window/Debugging/Output/Disassembly_Listing_File
Il faudra éventuellement modifier les propriétés du projet, il te dit comment faire
Si la première ligne affichée dans le listing est par exemple
9D0000DC 27BDFFF0 ADDIU SP, SP, -16
#define WDRV_NVM_SPACE_ADDR 0xDC
tu lis 4 octets dans ta flash en 0xDC, 0x9D0000DC, où chepakoi d'autres
et tant que tu lis pas les valeurs 27BDFFF0, pas la peine d'écrire
On va y arriver ...
L'index, c'est par rapport au début de la zone flash de 64k, que tu as déclarée en zone média par :
#define DRV_NVM_MEDIA_START_ADDRESS 0x9d070000
#define DRV_NVM_MEDIA_SIZE 64
Avec les fonctions nvm d'Harmony, on ne peut lire et écrire que dans cette zone média
Pour écrire en 0x9d070000, début de la zone média
#define DRV_NVM_MEDIA_START_ADDRESS 0x00000
pour écrire en 0x9d07f000, derniers 4096 octets de la zone média
#define DRV_NVM_MEDIA_START_ADDRESS 0x0f000
Pour lire partout dans la flash, il suffit d'utiliser un pointeur en castant l'adresse
uint8_t* pb = (uint8_t*)0x9d000000;
uint32_t* pi = (uint32_t*)0x9d000000;
sprintf(s, "0x%02X 0x%08X", *pb, *pi);
Mais dans l'immédiat, tu dois avoir une console série pour debugger, c'est un minimum
oops
Pour écrire en 0x9d070000, début de la zone média
#define WDRV_NVM_SPACE_ADDR 0x0000
pour écrire en 0x9d07f000, derniers 4096 octets de la zone média (et de la flash)
#define WDRV_NVM_SPACE_ADDR 0xf000
Merci Satinas,
En fait, pour pouvoir voir mes valeurs écrite dans la flash, j'ai dû passer sur le codage de mon bus RS232 qui communique entre ma carte et une télécommande filaire (clavier et lcd) pour afficher des valeurs.
Je viens de réussir à faire les transferts d'information (aller et retour) entre les deux ainsi je pourrai visualiser mes valeurs enregistrées
http://forums.futura-sciences.com/el...m-rs232-4.html
Je vais donc pouvoir repasser sur la mémoire flash
Satinas,
Pour écrire j'utilise donc cette fonction "WDRV_NVM_write(uint8_t *buf, int size)" si j'ai bien compris sur son utilisation, je fais
WDRV_NVM_write(mon tableau, taille du tableau) seulement ce que je me demandais, c'est comment tout ça ce place dans la flash ?
Si je fais mon tableau 1 : WDRV_NVM_write(mon tableau1, taille du tableau1)
puis mon tableau 2 : WDRV_NVM_write(mon tableau2, taille du tableau2)
on ne dois pas lui spécifier l'emplacement dans la flash à ton avis ? je me souviens dans d'autre application devoir faire quelques chose comme ça en fonction de la taille de la valeur :
NVMWriteWord((void*)(NVM_PROGR AM_PAGE + 0), out1_usb); // 4 octet
NVMWriteWord((void*)(NVM_PROGR AM_PAGE + 4), out2_usb); // 4 octet
NVMWriteWord((void*)(NVM_PROGR AM_PAGE + 8), out3_usb); // 4 octet
NVMWriteWord((void*)(NVM_PROGR AM_PAGE + 12), out4_usb); // 4 octet
NVMWriteWord((void*)(NVM_PROGR AM_PAGE + 16), out5_usb); // 4 octet
Il faut faire comme dans le fichier de départ où on a pris les 2 fonctions, écrire un bloc de données contenant toute ta configuration. S'il il n'y a qu'un tableau contenant la chaîne ip, tu écris le tableau, sinon il faut prévoir une structure contenant les différentes infos de ta config. Toute écriture avec la fonction write, commence par effacer les 4096 octets à partir de l'adresse fournie, et derrière on écrit un bloc, tableau ou structure.
Aux dernières nouvelles tu écris un un tableau de 13 octets, contenant une ip de 13 caractères, c'est à dire que tu rentres l'octet nul de fin de chaîne au marteau.
Bonjour satinas, bon je me remet sur la flash , après avoir eu l'impression d'avancer sur autre chose (partie RS232) et d'ailleurs j'essai de transferrer la lecture de ma flash sur mon pc via ma liaison rs232, seulement j'ai quelques difficultés.
Ma liaison qui fonctionne bien, je lis et écrit sur mon UART, seulement je pense traverser un problème de type de déclaration de variable comme tu me l'avais expliqué plus haut entre les char et les uint8_t, signé et non signé et je n'arrive pas à y palier.
En ma première idée est donc de caster la flash tout comme tu me l'a descrit :
je souhaite envoyer les infos au pc via RS232Code://déclaration uint8_t* pb = (uint8_t*)0x9d000000; uint32_t* pi = (uint32_t*)0x9d000000; char s[20]=""; //et construction de chaine de caratères: sprintf(s, "0x%02X 0x%08X", *pb, *pi);
donc je fait qq chose comme ça
Selement, j'ai ce type d'erreur qui me laisse à penser des problème de type de variableCode:while(PLIB_USART_TransmitterBufferIsFull(USART_ID_1)) { } PLIB_USART_TransmitterByteSend(USART_ID_1,s);
comment puis-je faire pour passer d'un tableau de char à un tableau de uint8_t ? et pouvoir ainsi l'envoyer.Code:make[1]: 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' make -f nbproject/Makefile-pic32mx_eth_sk+ioexp+11n+freertos.mk dist/pic32mx_eth_sk+ioexp+11n+freertos/production/pic32_eth_wifi_web_server.X.production.hex 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' "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/app2.o.d -o build/pic32mx_eth_sk+ioexp+11n+freertos/production/_ext/1360937237/app2.o ../src/app2.c ../src/app2.c: In function 'APP2_Tasks': ../src/app2.c:268:13: error: passing argument 2 of 'PLIB_USART_TransmitterByteSend' makes integer from pointer without a cast [-Werror] nbproject/Makefile-pic32mx_eth_sk+ioexp+11n+freertos.mk:917: recipe for target 'build/pic32mx_eth_sk+ioexp+11n+freertos/production/_ext/1360937237/app2.o' failed PLIB_USART_TransmitterByteSend(USART_ID_1,s); ^ In file included from ../../../../../framework/peripheral/usart/processor/usart_p32xxxx.h:603:0, from ../../../../../framework/peripheral/usart/processor/usart_processor.h:79, from ../../../../../framework/peripheral/usart/plib_usart.h:57, from ../src/system_config/pic32mx_eth_sk+ioexp+11n+freertos/system_definitions.h:69, from ../src/app2.h:60, from ../src/app2.c:56: ../../../../../framework/peripheral/usart/processor/usart_p32mx795f512l.h:4514:22: note: expected '__int8_t' but argument is of type 'char *' PLIB_INLINE_API void PLIB_USART_TransmitterByteSend(USART_MODULE_ID index, int8_t data) ^ cc1.exe: all warnings being treated as errors make[2]: *** [build/pic32mx_eth_sk+ioexp+11n+freertos/production/_ext/1360937237/app2.o] Error 1 make[2]: *** Waiting for unfinished jobs....
Merci de ton aide
Salut,
Pas la peine d'initaliser le tableau s, car juste derrière tu le remplis avec le sprintf.
Il te dit ce qui ne va pas, et te donne le prototypage de la fonction mal utilisée.note: expected '__int8_t' but argument is of type 'char *'
PLIB_INLINE_API void PLIB_USART_TransmitterByteSend (USART_MODULE_ID index, int8_t data)
On a vu que uint_8 est un octet non signé, ou un unsigned char c'est pareil.
la fonction send attend un int8_t, c'est à dire un octet signé, ou un char c'est pareil.
Donc il faut lui envoyer un char, toi tu lui fournis un tableau de char, c'est à dire l'équivalent d'un pointeur, d'une adresse de donnée(s), plutôt que la donnée elle-même.
Il faut faire une boucle qui envoie successivement tous les char du tableau s à la fonction send. La boucle s'arrêtera sur l'octet nul de fin de chaîne.
Mets cette boucle dans une fonction void usartSendString(char* s)
Oui j'ai pu m'en aperçevoir et je transmet maintenant mes valeurs, reste à les mettre en forme pour bien identifier les infos
voila ma boucle
Code:sprintf(s, "0x%02X 0x%08X", *pb, *pi); for (i=0;i<15;i++) { //s_s[i]=s[i]; while(PLIB_USART_TransmitterBufferIsFull(USART_ID_1)) { } PLIB_USART_TransmitterByteSend(USART_ID_1,s[i]); }
voila le type de réception, pas formé pour l'instant
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
346504D0x4D 0x5
Il faut que tu comprennes la notion de pointeur, car c'est très utile.
Si s est nul en entrée, ça plante, alors on rajoute "if (s)"Code:void usartSendString(USART_MODULE_ID index, char* s) { if (s) while (*s) { while (PLIB_USART_TransmitterBufferIsFull(USART_ID_1)) ; PLIB_USART_TransmitterByteSend(USART_ID_1, *s); s++; } }
Le s de départ et le s de la fonction n'ont rien à voir, ce sont 2 variables différentes, la première est une globale fournie en argument, et la seconde un paramètre (local) de la fonction.
j'ai les notions de pointeur, sauf erreur celui-ci représente l'adresse de la donnée, adresse que l'on peux incrémenter et récupérer la valeur à cette adresse.
Maintenant, j'ai effectivement du mal à comprendre dans certain cas de figure
par exemple : quand tu fais
J'ai du mal à comprendre ce que tu fais :
uint8_t* pb = (uint8_t*)DRV_NVM_MEDIA_START_ ADDRESS; // là je comprend pas ce que représente pb
uint32_t* pi = (uint32_t*)DRV_NVM_MEDIA_START _ADDRESS; // tu met bien l'adresse de départ sur le pointeur pi
le tout est de scanner toutes les adresses à partir du début et visualiser l'octet de données ?
Puis on vient incrémenter cette adresse et récupère ça données