изменить код операции в PIC18

Я написал программу на языке C. В этой программе ко мне мог получить доступ указатель на определенный адрес, и код операции мог его распечатать. Я использовал этот метод для написания самомодифицирующегося кода. Я сделал это в 8086 архитектура. Я хочу, чтобы он работал на микроконтроллере PIC18F2550. Я использую Mplab IDE 8.92 с Mplab C18 3.46. Я никогда не делал этого раньше с микроконтроллером. В отличие от 8086 Здесь у меня нет доступа к коду операции! Указатель - это адрес кода операции. Однако возвращаемое значение - 0X00! Это пример кода.

#include <stdio.h>
#include <stdlib.h>
void fsub(void){
int a,b;
a=3;b=5;
a-=b;
printf("a-b=%d\n",a);   
}
void fadd(void)
{
int a,b;
 a=3;b=5;
 a+=b;
 printf("a+b=%d\n",a);
 }
 void retadd(void);
 void main()
 {
  int i;
   unsigned char *instSub,*instAdd;
  unsigned char instructionSub[2];
  void *retadd_addr=(void*)retadd;
  retadd();
  instSub=(unsigned char*)retadd_addr;
  instAdd=(unsigned char*)retadd_addr+2;
  printf("%x\n", *instSub);
  printf("%x\n", *instAdd);
  while(1);
  }
  void retadd(void)
  {
   fsub();
    fadd();
   }

! [изображение с mplab] на этом изображении показаны значения 1


person user3161225    schedule 30.01.2014    source источник


Ответы (1)


Я не думаю, что вы сможете это сделать по двум причинам, которые я подробно описываю ниже:

Контроллеры PIC обычно хранят свою программу в флэш-памяти. Вы можете перепрограммировать флеш-память во время выполнения, но это не так просто, и обычно вы не можете написать ни одного слова, а должны написать целую «страницу» (или «сектор» или что-то в этом роде, т. Е. набор размером от 64 до 512 байт или около того) сразу. Это делает очень непрактичным изменение кода на том уровне, который вы пытаетесь сделать.

Кроме того, программная память обычно не имеет прямого доступа из-за того, что контроллеры используют гарвардскую архитектуру. Это означает, что у вас не может быть даже обычного указателя, указывающего на инструкцию, потому что данные и код находятся в разных адресных пространствах.

person unwind    schedule 30.01.2014
comment
@ user3161225 Вы можете получить доступ к кодам операций через вызовы специальных функций. Вы не можете получить адрес функции через `void retadd_addr = (void) retadd. Просмотрите ссылку на архитектуру Гарварда или еще лучше: посетите www.microchip.com и найдите документы по PIC18F2550. - person chux - Reinstate Monica; 31.01.2014
comment
Я получил адрес void retadd_addr = (void) retadd (см. Это изображение, показывающее значения); Но значение обратного адреса - 0x00! - person user3161225; 31.01.2014
comment
@ user3161225 Вы читали страницу Гарварда? Это действительно сбивает с толку. - person unwind; 31.01.2014