Bon courage pour la suite
Tu peux aussi agrandir la zone média, en espérant que cela ne détraque pas le château de cartes savamment construit avec harmonie.
-----
Bon courage pour la suite
Tu peux aussi agrandir la zone média, en espérant que cela ne détraque pas le château de cartes savamment construit avec harmonie.
Pour la flash, tout ça est régi par l'architecture MIPS.
La flash comporte une zone de boot non cachée de 12k en 0xbfc00000 et une autre zone de 512k (0x80000 octets).
Les 512k sont accessibles à travers des adresses virtuelles, soit dans le segment non caché kseg1 en 0xbd000000, soit dans le segment caché kseg0 en 0x9d000000.
il y a 2 types d'accès à la même mémoire flash physique, sans ou avec cache selon le contexte.
Bonjour,
j'essais de comprendre comment s'architecture la mémoire pour savoir ou placer mon bloque en autre choses, j'ai pour ça évidemment vu la docs mais surtout j'essai de comprendre comment et ou harmony organise tout ça car à l'origine du programme il n'utilise pas de linker (fichier procdefs.ld) , ce qui serait plus facile d'avoir une vue globale sur la mémoire si c'était le cas.
Les fois ou le linker est récupéré par harmony est seulement quand je choisie l'option bootloader et encore là il ne ce compile pas correctement.
j'ai fais quelques recherche à ce sujet, comme ici : http://picatout-jd.blogspot.fr/2013/...rtie-3-la.html histoire d'y voir plus claire
j'aimerai bien construire une cartographie de la mémoire utilisé de mon proc, sous le dédale de programme source, je ne sais pas ou chercher.
pour la taille alloué au pages web, d'après mon soft ce serait
entre 9d000000 et (64*1024)+9d000000=9d010000 ce qui fait 65536 de taille , si je dis pas trop de bêtises.
Seulement quand je voie la taille du fichier mpfs_img2.c , celui-ci fait 412 ko est-ce représentatif de la taille qu'il prend dans la mémoire ?
Donc a priorie :
mes pages web prennent 61908 octet car elles commence donc à 0x9d000000 jusqu'à 0x9d00f1d4 il me reste donc 3627octet inférieur au bloc de 4096 nécessaire.
La solution serait de réduire le taille des pages web, ce qui tout à fait envisageable car il y en a beaucoup trop dont je n'est forcement pas besoin.
ou y a t-il autre solution plus judicieuse que la mienne (je suppose que c'est pas compliqué (: )
Nickel !! ça fonctionne correctement, reste plus qu'a faire la bonne structure à enregistrer qui regroupe tout les paramètres réseaux
En faite, j'ai viré pas mal de place pris par les pages web, dont je n'avais pas besoin pour mon projet et libérer ainsi plus de 12000 octet là ou il m'en manquait qu'environ 400.
Tu mets une EEPROM I²C
64Kb http://fr.farnell.com/webapp/wcs/sto...=213247516&vw=
Merci pour ta réponse Daudet, je vais certainement prendre, mais en fait, j'ai déjà prévu et câblé une flash extérieur en SPI en prévision, seulement au vu du temps qui mes impartie et du temps que j'ai surtout mis à implémenter mon code, j'ai préférer remettre à plus tard le codage en communication de ma flash.
En prévision de me mettre dessus en cas ou j'ai besoin d'alourdir mes page web notamment qui pour le moment sont raisonnablement allégé, pour me permettre de caser mes paramètres réseaux comme je le souhaitai.
Par contre, j'ai bien repéré ou ce situait l'initialisation des paramètres réseau (ip, mask, passerel...), situé dans le system_init.c sous harmony mais quelqu'un pourrait me dire ou ce situe l'init des paramètres wifi(ssid, cle wep...), je cherche toujours mais j'ai des doutes, il ne ce trouve pas là ou le reste s'initialise, mais je cherche toujours.
Merci
Pour la 9999ème fois, utilise findstr, dans le dossier de ton appli
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,
avec ma fonction d'écriture j'écrit donc bien dans ma flash un tableau et pour sauvegarder toutes une stucture faut-il que je fasse la fonction qui va bien , ou exist-il un code plus simple pour ce faire.
Au premier abord, j'avais pensé assez brutalement mettre toute la conf dans un tableau, les un à la suite des l'autre comme tab_conf[]={ip,mask,passerel, dns1,dns2,...} et ensuite aller chercher l'info au bonne emplacement de la flash ou du tableau, il y a certainement plus structuré je suppose ?
si j'ai une structure
Code:typedef struct { char new_IP[16]; char new_MASK[16]; char new_GATEWAY[16]; } APP_DATA_TCPIP;
je sais pour l'avoir bêtement essayé (: qu'il s'agit pas de faire : WDRV_NVM_write_new(appDataTCPI P,48);
Sinon, quel genre de caractère que l'on rentre en fin de chaine, c'est pas uniquement "0" ? pour ça détection car il peut-être présent dans la données, il y a pas un /
Salut,
Je note que tu as pris un jour de congé hier, tu vas finir par prendre du retard
https://openclassrooms.com/courses/a...-de-caracteres
Oui , ça fait du bien, sinon j'explose (:
le fameux caractère '\0' c'est un octet nul, dès qu'il y a un octet nul, la chaîne est finie.
L'initialisation par char *s = "xxx", ainsi que les fonctions de manipulation de chaînes, ajoutent automatiquement cet octet nul.
Dans le cas où on remplit la chaîne caractère par caractère, là il faut l'ajouter à la main, derrière le dernier caractère.
je vais jouer l'oiseau de mauvais augure ......
Tu as regardé combien de fois tu peux ré-écrire la flash ? Dans la datasheet, il garantisse 1000 écritures (au moins)
oui effectivement; c'est que je fais sur cette boucle ou je récupère mon ip en retour de la page weble fameux caractère '\0' c'est un octet nul, dès qu'il y a un octet nul, la chaîne est finie.
L'initialisation par char *s = "xxx", ainsi que les fonctions de manipulation de chaînes, ajoutent automatiquement cet octet nul.
Dans le cas où on remplit la chaîne caractère par caractère, là il faut l'ajouter à la main, derrière le dernier caractère.
par contre, je sais pas si c'est normal mais dans ma flash, je ne vois rien qui s'apparente à '\0' en fin de caractèreCode:for ( inc=6; inc<19; inc++) { appDataTCPIP.new_IP[tabIP] = *( httpDataBuff+inc); tabIP++; } appDataTCPIP.new_IP[15]='\0';
Code:0x9D00E000:0x31 0x39 0x32 0x2E 0x9D00E004:0x31 0x36 0x38 0x2E 0x9D00E008:0x31 0x2E 0x31 0x33 0x9D00E00C:0x30 0x00 0x00 0x00
L'usure de la flash, ça concerne aussi le flashage du soft, le pire c'est les PIC18F97J60 avec internet intégré, 100 écritures max.
certainement, mais pour faire 1000 test de soft, ça peut prendre un bout de temps.
Par contre, si il fait une sauvegarde des paramètres toutes les minutes, au bout de un jour, il peut avoir des problèmes ... et sans avertissement (si il n'y a pas une vérification systématique après écriture) !
je pense pas avoir atteint la limite d'écriture qui sont au dessus des 1000 cycle d'après mes vagues souvenir et pour utiliser depuis quelques temps un starter kit que j'utilise toujours.
la carte que je programme est plus récente encore, et j'écris bien mon ip , pourquoi pas le \0, d'ailleurs ça devrait correspondre à quel octet, pas 55 00
Mes 2 pic32 depuis 6 ans, vaut mieux pas savoir combien de fois je les ai flashés, mais je les vendrai à personne.
davidif, une simple quote (caractère) c'est pas un guillemet (chaîne).
char *s = "xxx"
char c = 'A';
char c = '0'
char c = '\0';
le \ permet de mettre le code ascii au lieu de mettre le caractère. donc '\0', c'est 0, un OCTET NUL !
Bah !! au vue des nombreuses difficulté rencontré et au nombreuses reprogrammation, j'ai pas compté mais c'est possible (:
la sauvegarde en flash concerne seulement les paramètres réseaux, donc ont les changes pas non plus fréquemment normalement et quelques données lors d'interruptions.
d'accord, donc c'est normal d'avoir un octet nul en flash à la fin ?
Donc si j'utilise certaines instructions de récupération de caractère pour l'IP par exemple, celle-ci généralement s'arret au \0 , comment identifier la fin si il n’apparaît pas dans la flash ? un caractère null peut-être dans la données , comme une IP ? pas seulement à la fin
Tu as l'air de confondre le caractère '0' qui dans ta flash est un 0x30(48) et le caractère '\0' qui est un 0x00(0), fin de chaîne.
Le fait de parler de caractère pour '\0', ça ajoute à la confusion, c'est un octet nul et puis c'est tout.
Une structure c'est différent, aucune analogie avec une chaîne.
HA oui , c'est vrai , autant pour moi
bon bah voila, ma fonction de savegarde
J'ai vu un truc comme ça et qui fonctionne, qu'en pensez vous ?Code:bool WDRV_NVM_write_new() { char *buf; int i,j,k, 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; //} k=0; for (j=0;j<10;j++) { i=0; if(j==0) buf=appDataTCPIP_WIFI.new_IP; if(j==1) buf=appDataTCPIP_WIFI.new_MASK; if(j==2) buf=appDataTCPIP_WIFI.new_GATEWAY; if(j==3) buf=appDataTCPIP_WIFI.new_DNS1; if(j==4) buf=appDataTCPIP_WIFI.new_DNS2; if(j==5) buf=appDataTCPIP_WIFI.new_DHCP; if(j==6) buf=appDataTCPIP_WIFI.new_SSID; if(j==7) buf=appDataTCPIP_WIFI.new_WEP; if(j==8) buf=appDataTCPIP_WIFI.new_WPA; while(buf[i]!='\0') { NVM_DATA_BUFF_local[k] = buf[i]; k++; 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_MY_CONFIG_ADDR, DRV_NVM_ROW_SIZE); if (DRV_NVM_COMMAND_HANDLE_INVALID == nvmCommandHandle) { return false;; } tmp = WDRV_NVM_MY_CONFIG_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_MY_CONFIG_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; }
Mon bloc
0x9D00E000:0x31 0x39 0x32 0x2E
0x9D00E004:0x31 0x36 0x38 0x2E
0x9D00E008:0x31 0x2E 0x31 0x31
0x9D00E00C:0x30 0x32 0x35 0x35
0x9D00E010:0x2E 0x32 0x35 0x35
0x9D00E014:0x2E 0x32 0x35 0x35
0x9D00E018:0x2E 0x32 0x31 0x39
0x9D00E01C:0x32 0x2E 0x31 0x36
0x9D00E020:0x38 0x2E 0x31 0x2E
0x9D00E024:0x32 0x31 0x39 0x32
0x9D00E028:0x2E 0x31 0x36 0x38
0x9D00E02C:0x2E 0x31 0x2E 0x33
0x9D00E030:0x31 0x39 0x32 0x2E
0x9D00E034:0x31 0x2E 0x38 0x39
0x9D00E038:0x2E 0x32 0x00 0x00
Dernière modification par davidif ; 29/08/2016 à 19h55.
Ne mélange pas les choses. D'abord tu renseignes le contenu de la structure config, ensuite tu l'écris en bloc par
WDRV_NVM_write_new(((uint8_t *)&appDataTCPIP_WIFI, sizeof(appDataTCPIP_WIFI));
Le compilateur connait la taille de tous les tableaux et structures que tu as déclarés, donc tu peux utiliser l'opérateur sizeof(), ça t'évitera des calculs superflus.
Ha ok !! merci j'essai demain et pour la lecture, je fais pareil pour recharger ma structure ?Ne mélange pas les choses. D'abord tu renseignes le contenu de la structure config, ensuite tu l'écris en bloc par
WDRV_NVM_write_new(((uint8_t *)&appDataTCPIP_WIFI, sizeof(appDataTCPIP_WIFI));
Le compilateur connait la taille de tous les tableaux et structures que tu as déclarés, donc tu peux utiliser l'opérateur sizeof(), ça t'évitera des calculs superflus.
Sinon, une question concernant toujours la mémoire, en plus des paramètres réseaux qui eux nécessite pas une écriture fréquente, je pense devoir utiliser ma flash externe en SPI( SST26VF064b) que j'ai mis sur ma carte et pas encore utilisé car j'ai d'autres valeurs à mémoriser, valeurs à écrire plus régulièrement sur l'état du système donc pour la flash interne ça risque d'êtres limité en cycle d'écriture.
selon toi c'est compliqué à mettre en oeuvre ? est-ce la même méthode d'écriture que pour la flash interne ?
pour charger la config, la fonction memcpy() devrait convenir.
ou tu utilises un pointeur sur la structure directement en flash.
findstr /s /c:SST26 *.h ou *.c dans harmony retourne des choses intéressantes
chaque fois que tu te poses une question, tape findstr
Mine de rien, t'es en train d'annoncer que tout le travail fait sur la flash interne ne sert à rien, car il y avait sur la carte une seconde flash qui attendait sagement qu'on s'occupe d'elle.