1.- Necesito aclarar una duda para entender mejor el micro pic. No consigo saber porque algunos registros de SFR de la ram se repiten en los bancos. Ejemplo del PORTB tiene 2 direcciones de memoria, usualmente utilizo la primera para acceder directamente al registro pero la otra dirección no se porque existe.
Esto es una pregunta mas de de PIC16 que de PIC18 (ya que tu otra pregunta habla sobre PIC18) Como tampoco esta muy clara voy adecir un par de cosas y espero alguna pegarle a tu inquietud.
No existe en ningun PIC 2 registros PORTB. En el PIC18 tendras LATB y PORTB entre otros, que cumplen distintos propositos. Ademas todos los SFR se encuentra en el banco 15. El que pueda acceder a los mismos desde cualquier punto no significa que este en todos los bancos. Y tambien tenes direcciones de memoria en los cuales podes usar los registros desde cualquier lado que es desde 0x00 a 0x5F. Del banco 0, por mas que estes ubicado en otro lado.
Respecto a los PIC16 la RAM esta formada de otra forma, los SFR estan dispersos por los bancos, por lo cual para estar modificando los modulos tenes que estar cambiando de bancos constantemente, en estos PICs pueden suceder 2 cosas. La primera es que reservar 16 bytes correspondientes al banco 0 que empieza en 0x70 y termina en 0x7F, esos GPR pueden ser accedidos desde los bancos 1,2,3,4 etc ya que internamente todos acceden al banco 0. Y tambien ocurre que por ejemplo en los PICs mas pequeños solo tienen 2 bancos de GPR, entonces el banco 2, las direcciones de GPR acceden a las del banco 0, y las del banco 3 al banco 1.
La idea detras de todo esto es ... que tengas que cambiar lo menos posible de banco para realizar algo. Ejemplo en un PIC16 si tengo un registro que uso siempre entonces lo voy a poner en 0x70, ya que alli puedo acceder desde cualqueir banco sin problemas.
2.-También quiero crear un vector de char de 256 bytes protegiendo algún bloque gpr de la ram con un pic18f4520, encontré por internet este código que lo hace en C18
Eso que sacaste ahi es el archivo linker del compilador XC8/C18. El archivo ese le indica al linker cuales son las porciones de memoria que hay y que cantidad. De esa forma una ves compilado el programa el linker acomoda las variables alli dentro. En XC8 podes usar __at()
Lo que no entiendo es que queres llegar a hacer..
un vector de char de 256 bytes protegiendo algún bloque gpr de la ram
Simplemente tenes que tener la precaucion de no escribir en array. Si lo queres fijo ( y que vaya a la FLASH ) entonces usa el
constSi haces una funcion que usa ese array, en el prototipo y funcion agregale el const, asi sabe que si lo modificas te tire un error.
No se porque queres bloquear una parte de la RAM para ese motivo.
Lo que digo es que tal ves estas tomandote mas problemas de los que hay