2016-09-29 8 views
3

Je suis en train de construire une fonction de mise à jour qui efface complètement mon code de programme en cours de programmation, et fait clignoter une nouvelle image à sa place. Pour ce faire, il est nécessaire de copier la fonction de mise à jour dans la mémoire RAM et de s'y connecter dans son emplacement RAM pour exécuter les fonctions d'effacement/programme réelles.Devrais-je désactiver les interruptions lors de l'exécution de code depuis la RAM?

void update(){ 
    //Erase flash 
    //Program flash 
} 

void main(){ 
    // ... 

    ramfunction = copytoram((int)update); 
    ramfunction(); 
} 

Ce processus semble fonctionner correctement mais, pour une raison ou une autre, il échoue. Je semble être en mesure de passer à travers avec le débogueur, mais quand je cours il échoue.

Devrais-je protéger ramfunction(); en désactivant peut-être les interruptions? J'ai d'autres tâches en cours en arrière-plan. Y a-t-il d'autres problèmes probables?

Merci beaucoup! Editer - Toutes les autres tâches sont exécutées à partir de Flash. La fonction de mise à jour est liée à l'exécution à partir de Flash mais je peux copier avec succès pour ram et branchez-le. Je peux même passer à travers (au moins le code de démontage), c'est seulement quand je le traverse que j'ai des problèmes.

+0

Je trouve ceci une question très intéressante bien qu'elle puisse se fermer parce qu'elle est assez large. – xxbbcc

+0

@xxbbcc: En supposant que les détails nécessaires seront ajoutés, il ne sera toujours pas applicable. Il y a juste trop de variables pour ce sujet. – Olaf

+0

Que puis-je vous fournir pour le rendre plus spécifique? – superuser826

Répondre

1

Si d'autres tâches sont exécutées simultanément, il est possible qu'elles interrompent la phase de programmation de la fonction ramf. Cela pourrait entraîner une défaillance catastrophique. Je voudrais essayer quelque chose comme ceci:

void main(){ 
    // ... 

    ramfunction = copytoram((int)update); 
    disable_interrupts(); 
    ramfunction(); 
    enable_interrupts(); 
}