Ir ao conteúdo
  • Cadastre-se
Alane Pontes

RESOLVIDO [DUVIDA - MEMÓRIA PIC18]

Recommended Posts

Boa tarde.

 

Pessoal, estou com problemas em relação a usar todas os blocos de memória do PIC18F4550.

Li inúmeros tutoriais, mas nenhum me ajudou completamente em solucionar o problema.

 

Bom, o que acontece é o seguinte:

 

Preciso alocar um vetor de 1000 elementos no PIC. Sem nenhum gerenciamento de memória, eu consigo, no máximo, alocar um vetor de 100 elementos. 

Tentei alocar a memória com o memset, mas sempre quebra minha aplicação. E outra, o pic tem 32k de memória flash, somente leitura, 2k de SRAM e 256bytes de EEPROM. A ideia que eu tenho é de janelar entre as memórias para poder alocar o vetor de 1000 posições na flash, ir lendo ao poucos a medida que preciso dos dados para fazer mudanças, escrita ou sobreescrita, isso porque estou simulando escalonamento de discos com os algoritmos do SSF e SCAN. Alguém poderia me dar uma luz de como fazer isso? Funções e maneiras de usar. Obrigada, desda ja.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Geralmente se fizer isso dá certo

unsigned char vetor[1000];

Mas depende da qualidade do compilador. P.ex. apesar da memória ser segmentada o hitech-c aloca direitinho. Outros podem exigir definir os bancos por diretivas. Tem que ver o help deles.

E 100 tá muito estranho. Não seria 0x100? Neste caso seriam 256 elementos e você pode usar um artifíco de alocar 8 bancos de 256. Depois falo sobre isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, Isadora, bom, pelo que eu vi até agora, eu tenho de usar um LINKER SCRIPT. Tô usando o MPLAX e o C18. Mas ainda não entendi muito bem como funciona. Você saberia explicar? O código tá nesse link, se você poder dá uma olhada... http://pastebin.com/JN9JXwR8

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dei uma olhadela rápida e não consegui conectar o "alocar 1000 elementos" com algum eventual erro ou warning que seu compilador possa estar dando. Sugiro recompilar, identificar a linha onde ocorre e mostrar o erro que está achando. Informo que não uso este compilador

 

pra quem tem receio ou não gosta (=eu) de clicar em link externo, cá está o fonte da moçoila...

#include <p18f4550.h>
#include <stdio.h>
#include <stdlib.h>
#include <usart.h>
#include <string.h>
 
/*-------------------------------------
* Bits de configuração do PIC18F4550
*--------------------------------------*/
// Oscilador e outras definicoes de registradores
#pragma config FOSC     = HS     // (8 MHz)
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BORV     = 3
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = OFF
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
#pragma config STVREN   = ON
#pragma config LVP      = OFF
 
//Variáveis globais
int pi,tam;
char *cv;
char escolha[1];
char fim[3];
int vetor[]= {95, 180, 34, 119, 11, 123, 62, 64};
 
int a[]= {95, 180, 34, 119, 11, 123, 62, 64},b[9];// vetores auxuliares
 
int d[9];
/*Configura e habilita a comunicação serial*/
void inicializarSerial()
{
        OpenUSART(      USART_TX_INT_ON &
                                USART_RX_INT_ON &
                                USART_ASYNCH_MODE &
                                USART_EIGHT_BIT &
                                USART_CONT_RX &
                                USART_BRGH_HIGH,51);
        //putrsUSART("HELLO! ");
}
 
void imprime(){
    int j;
    for(j=0;j<9;j++){
        itoa(a[j],cv);
        putsUSART(cv);
        putrsUSART(" ");
 
    }
    putrsUSART("| ");
    //putrsUSART("\0");
   // getsUSART(inputstr,5);
  //getsUSART( inputstr, 5 );
    //putsUSART(inputstr);
}
 
void scan(int tam, int pi){
 
        int i,j, na = tam;
        int disk=pi;   //loc da posição inicial
        int temp,max;
        int dloc=0;   //loc do acesso no array
 
        for(i=0;i<na;i++){
                d=vetor;
        }
 
        d[na]=disk;
        na=na+1;
 
        for(i=0;i<na;i++){    // Ordenação das entradas
 
                for(j=i;j<na;j++){
                        if(d>d[j]){
                        temp=d;
                        d=d[j];
                        d[j]=temp;
                }
                }
        }
 
        max=d[na];
 
        for(i=0;i<na;i++){   // acha a localização da posição inicial no array
                if(disk==d) { dloc=i; break;  }
        }
 
    for(i=dloc;i>=0;i--){
                itoa(d,cv);
        putsUSART(cv);
        putrsUSART(" ");
        }
 
        for(i=dloc+1;i<na;i++){
                itoa(d,cv);
        putsUSART(cv);
        putrsUSART(" ");
        }
    putrsUSART("| ");
}
 
void ssf(int tam, int pi){
 
        int deslocamento=0,n=tam,temp=0,menorDesl=0;
        int k=0,x=0,t=0,i=0,j=0; //variaveis auxiliares
 
        a[0]=pi;// posição 0 do vetor recebe posição inicial
 
        //passa vetor de entrada para vetor auxiliar, assim o vetor original não é modificado
        for(i=1;i<=n;i++){
                a=vetor[i-1];
        }
 
        b[k++]=a[0];
 
        // organiza o vetor comparando a menor distancia entre a posição i e j
        // de acordo com que as posições são encontradas os numeros vão sendo armazenados no vetor b
        for(i=0;i<n;i++){
                menorDesl=10000;
                for(j=i+1;j<=n;j++){
                        if(a>a[j])
                deslocamento=a-a[j];
                        else
                deslocamento=a[j]-a;
                        if(deslocamento<menorDesl){
                        menorDesl=deslocamento;
                        x=j;
                        }
                }
                t+=menorDesl;
                temp=a[i+1];
                a[i+1]=a[x];
                a[x]=temp;
                b[k++]=a[i+1];
        }
 
        //imprime vetor saida
    imprime();
}
 
void main() {
    inicializarSerial();
    pi=35;
    tam=8;
 
    putrsUSART("Escolha o metodo:\n");
    putrsUSART("1-SSF 2-SCAN\n");
 
    getsUSART( escolha, 1 );
 
    if(escolha[0]=='1')
        scan(tam,pi);
 
    if(escolha[0]=='2')
        ssf(tam, pi);
 
    getsUSART( fim, 2 );

 }

e

#include <p18f4550.h>
#include <stdio.h>
#include <stdlib.h>
#include <usart.h>
#include <string.h>

/*-------------------------------------
* Bits de configuração do PIC18F4550
*--------------------------------------*/
// Oscilador e outras definicoes de registradores
#pragma config FOSC     = HS     // (8 MHz)
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BORV     = 3
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = OFF
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
#pragma config STVREN   = ON
#pragma config LVP      = OFF

//Variáveis globais
int pi,tam;
char *cv;
char escolha[1];
char fim[3];
int vetor[]= {95, 180, 34, 119, 11, 123, 62, 64};

int a[]= {95, 180, 34, 119, 11, 123, 62, 64},b[9];// vetores auxuliares

int d[9];
/*Configura e habilita a comunicação serial*/
void inicializarSerial()
{
    OpenUSART(    USART_TX_INT_ON &
                USART_RX_INT_ON &
                USART_ASYNCH_MODE &
                USART_EIGHT_BIT &
                USART_CONT_RX &
                USART_BRGH_HIGH,51);
    //putrsUSART("HELLO! ");
}

void imprime(){
    int j;
    for(j=0;j<9;j++){
        itoa(a[j],cv);
        putsUSART(cv);
        putrsUSART(" ");

    }
    putrsUSART("| ");
    //putrsUSART("\0");
   // getsUSART(inputstr,5);
  //getsUSART( inputstr, 5 );
    //putsUSART(inputstr);
}

void scan(int tam, int pi){

    int i,j, na = tam;
     int disk=pi;   //loc da posição inicial
     int temp,max;
     int dloc=0;   //loc do acesso no array

    for(i=0;i<na;i++){
        d=vetor;
    }

    d[na]=disk;
    na=na+1;

    for(i=0;i<na;i++){    // Ordenação das entradas

        for(j=i;j<na;j++){
               if(d>d[j]){
                temp=d;
                d=d[j];
                d[j]=temp;
            }
          }
    }

    max=d[na];

    for(i=0;i<na;i++){   // acha a localização da posição inicial no array
        if(disk==d) { dloc=i; break;  }
    }

    for(i=dloc;i>=0;i--){
        itoa(d,cv);
        putsUSART(cv);
        putrsUSART(" ");
    }

    for(i=dloc+1;i<na;i++){
        itoa(d,cv);
        putsUSART(cv);
        putrsUSART(" ");
    }
    putrsUSART("| ");
}

void ssf(int tam, int pi){

    int deslocamento=0,n=tam,temp=0,menorDesl=0;
    int k=0,x=0,t=0,i=0,j=0; //variaveis auxiliares

    a[0]=pi;// posição 0 do vetor recebe posição inicial

    //passa vetor de entrada para vetor auxiliar, assim o vetor original não é modificado
    for(i=1;i<=n;i++){
        a=vetor[i-1];
    }

     b[k++]=a[0];

     // organiza o vetor comparando a menor distancia entre a posição i e j
     // de acordo com que as posições são encontradas os numeros vão sendo armazenados no vetor b
     for(i=0;i<n;i++){
          menorDesl=10000;
          for(j=i+1;j<=n;j++){
               if(a>a[j])
                deslocamento=a-a[j];
               else
                deslocamento=a[j]-a;
               if(deslocamento<menorDesl){
                menorDesl=deslocamento;
                x=j;
               }
          }
          t+=menorDesl;
          temp=a[i+1];
          a[i+1]=a[x];
          a[x]=temp;
          b[k++]=a[i+1];
     }

     //imprime vetor saida
    imprime();
}

void main() {
    inicializarSerial();
    pi=35;
    tam=8;

    putrsUSART("Escolha o metodo:\n");
    putrsUSART("1-SSF 2-SCAN\n");

    getsUSART( escolha, 1 );

    if(escolha[0]=='1')
        scan(tam,pi);

    if(escolha[0]=='2')
        ssf(tam, pi);

    getsUSART( fim, 2 );
 }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando tiver em casa,passo como fazer um LINKER SCRIPT,mas acho que com 1000 elementos não da,pois voce vai ficar sem USB,se for usar.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal, continuo com problemas pra alocar o vetor que eu gostaria, ainda não consigo nem com 250. Coloquei abaixo o meu código refatorado, pra ficar melhor de enteder, também coloquei LINKER SCRIPT que eu fiz. Eu tô usando o MPLABX, como mencionei, e o compilador é o C18. 

 

Com 250 elementos no vetor, o MPLABX não me deixa nem compilar e mostra esse erro: 

 

 
CLEAN SUCCESSFUL (total time: 63ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/alane/Documents/escalonadorx.X'
make  -f nbproject/Makefile-default.mk dist/default/production/escalonadorx.X.production.hex
make[2]: Entering directory 'C:/Users/alane/Documents/escalonadorx.X'
"C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F4550 -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/escalonador.o   escalonador.c 
make[2]: *** [build/default/production/escalonador.o] Error 3
MPLAB C18 3.47 (feature limited)
Copyright 2000-2011 Microchip Technology Inc.
make[1]: *** [.build-conf] Error 2
This version of MPLAB C18 does not support the extended mode
make: *** [.build-impl] Error 2
and will not perform all optimizations.  To purchase a full
copy of MPLAB C18, please contact your local distributor or
visit buy.microchip.com.
 
WARNING:  This version of MPLAB C18 does not support procedural abstraction.  Procedural abstraction will not be run.
 
C:\Users\alane\Documents\escalonadorx.X\escalonador.c:33:Error: syntax error
nbproject/Makefile-default.mk:102: recipe for target 'build/default/production/escalonador.o' failed
make[2]: Leaving directory 'C:/Users/alane/Documents/escalonadorx.X'
nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/alane/Documents/escalonadorx.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
 
BUILD FAILED (exit value 2, total time: 399ms)

 

MEU CÓDIGO

#include


#include
#include
#include
#include

/*-------------------------------------
* Bits de configuração do PIC18F4550
*--------------------------------------*/
// Oscilador e outras definicoes de registradores
#pragma config FOSC = HS // (8 MHz)
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BORV = 3
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = OFF
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
#pragma config STVREN = ON
#pragma config LVP = OFF

/** Definação das Constantes:
* TAMANHO = Nº DE ELEMENTOS NO VETOR
* CABECA_DA_FILA = REFERE-SE AO PONTO DE PARTIDA DO ALGORITMO
* ULTIMO_DA_FILA = REFERE-SE AO PONTO FINAL DO ALGORITMO
**/
#define TAMANHO 250
#define CABECA_DA_FILA 50
#define ULTIMO_DA_FILA 9999

// Assinaturas das funções
imprime();
ssf(int tamanhoVetor, int cabecaDaFila);
menuInicial();
inicializarSerial();


//Variáveis globais
char mensagem[40];
char *numero;
char opcao[1];

// VETOR COM 1000 ELEMENTOS
//rom int vetor[TAMANHO] =
//{1105,1645,636,58,1014,1136,1507,1917,1981,1020,1646,1537,1382,1873,1906,553,1742,1589,1586,89,1324,187,1827,608,1759,1855,1228,875,1201,590,1400,599,1964,262,682,1884,120,462,731,1058,1008,1960,1208,973,1154,131,279,393,1534,1189,1148,1532,1679,567,1346,1366,578,1294,1985,783,841,709,703,197,1104,358,523,692,141,414,1332,299,646,468,1205,1515,1158,1032,1300,628,1096,597,534,1968,381,1600,755,667,1597,1120,1644,16,1178,675,1046,29,575,1946,973,291,884,1775,1968,692,893,285,1079,140,1020,459,1137,1848,123,31,1571,286,625,1023,1480,1390,1953,776,166,127,729,824,863,11,713,444,1874,1651,1937,233,1832,1941,1026,1555,309,1978,1148,203,1487,298,587,1112,1118,531,1391,1476,1476,1069,66,110,1542,827,793,1400,117,1716,131,677,102,895,668,381,646,410,1607,830,401,318,731,1960,1582,1878,746,868,1065,1906,1438,507,1233,1893,1637,1378,1797,1981,1451,551,306,373,1727,876,1561,1302,228,1721,662,1115,476,1068,894,604,1740,1332,183,146,1136,1733,334,767,1306,571,1768,710,1649,1239,984,1611,1562,332,455,868,677,680,1191,1309,1548,661,667,1732,758,1632,1359,435,926,1827,1583,316,574,1548,878,631,1318,1027,634,1022,364,762,1189,1896,769,707,1124,1743,442,1131,959,509,1341,512,1976,591,855,294,1396,1570,1823,860,1605,1257,161,1560,1682,167,1577,141,1911,988,1327,1419,529,1170,1496,1541,401,1195,759,679,1864,1650,100,1494,437,680,454,1229,638,1919,745,1752,1606,1496,1277,421,760,1202,1967,1086,213,1423,1365,1090,1152,1925,948,611,1908,1079,1651,1181,1938,638,100,734,429,1642,520,1020,750,1554,786,1731,470,1215,1584,192,1159,720,155,1941,684,1799,584,61,1238,807,1111,1595,797,904,1421,1900,244,533,1399,264,861,1776,1302,656,1425,698,1824,1930,617,252,1025,338,957,859,1587,1691,999,243,374,1024,997,621,751,81,1752,1839,651,1503,874,1553,1834,1020,1174,38,329,1533,391,1733,517,1389,1995,103,1824,1730,1263,916,1491,228,1366,1540,1402,1077,672,326,1419,1562,985,706,208,66,954,1073,1023,849,1341,41,410,1452,1405,1198,304,1054,84,1918,486,646,217,1343,878,349,522,1128,1622,1726,535,1037,1443,1437,245,1984,1236,1070,639,1621,367,500,1866,52,1638,620,256,1787,1405,1777,1895,505,1800,772,992,1747,537,1758,1737,1106,264,881,891,28,1934,1010,807,1809,1164,1402,1116,885,1047,1631,1783,997,1385,1653,763,349,822,317,1973,328,833,1197,1790,893,1041,1064,811,225,1842,858,75,726,785,1495,1480,1973,1701,1356,605,1706,26,805,659,455,305,1569,779,1892,338,1338,389,1507,933,418,1845,702,743,1785,75,1894,151,383,455,716,670,9,604,1922,836,633,355,84,47,1492,591,664,334,1796,186,1577,518,1412,751,1816,1733,339,1422,251,1778,343,394,179,266,583,429,1739,1043,1575,50,763,841,338,646,1174,1637,66,208,518,688,167,897,725,706,1016,193,690,1143,269,1818,1772,61,67,1161,1801,546,996,426,1693,141,1125,1219,1255,268,984,792,1286,1101,1810,669,1566,1865,919,857,811,1030,534,1384,1217,1358,923,1362,655,1290,1192,302,138,628,1562,907,631,980,1495,1045,1815,1950,489,1136,1889,526,913,1666,13,1644,700,44,1466,397,254,524,141,850,423,1412,1446,942,859,274,1224,1431,632,364,762,1360,1427,1992,515,1004,179,1052,1607,1783,469,1421,722,1086,559,464,478,496,374,1341,1863,376,297,358,1847,278,1116,64,1749,1158,958,1319,453,1859,1573,57,1086,824,784,946,218,520,478,689,1211,531,1955,157,1791,1799,996,1098,441,973,1480,1622,716,337,916,1192,1058,1290,1703,329,226,1840,485,766,913,1090,442,256,660,170,1848,753,1655,1603,753,1191,1505,1557,127,587,1589,1959,312,1658,67,1943,121,1708,1156,590,433,1977,759,1445,627,1179,1037,1758,697,1451,1025,1944,391,1430,884,1205,1221,1670,1878,1802,1684,132,677,933,540,1949,1071,1698,1496,195,701,1104,1121,882,887,1597,366,1884,157,1070,499,29,562,838,828,1067,386,1524,37,1725,1322,1349,1486,1589,729,1776,1317,1010,54,1986,713,1765,1008,157,148,1690,1601,1,1976,1002,626,1547,203,523,1676,1625,784,543,303,25,284,1520,405,1793,1262,344,430,649,1203,388,501,974,353,63,48,356,299,1083,48,1142,1638,185,455,1990,1574,493,1927,864,790,1268,1436,1457,1450,1250,1854,1512,644,1314,118,1996,162,662,1050,609,1899,1263,450,1590,766,1770,1532,290,1439,617,1312,1485,1778,534,35,890,286,1184,1240,1848,1431,1142,550,1663,1174,949,1786,542,1567,1440,1497,619,1743,74,1497,1028,1149,493,1512,1491,1371,1013,518,1395,1391,271,1872,1823,1616,762,1827,508,527,1453,1531,184,295,1229,1088,1291,196,1362,794,513,1183,1733,1129,1122,1450,26,1605,1576,1333,1617,1054,1367,394,360,468,1563,30,1006,1966,30,1448,472,1991,1798,1362,1666,1329,1530,233,101,1049,1582,423,8,1943,1603,81,1173,1582,156,1131,208,1554,1329,175,487,10,1792,1685,1451,1081};

//rom int vetor[] = {0, 11, 34, 50, 62, 64, 95, 119, 123, 180, 199};
#pragma romdata DATAX
//VETOR COM 250 ELEMENTOS
rom int vetor[] = {1105,1645,636,58,1014,1136,1507,1917,1981,1020,1646,1537,1382,1873,1906,553,1742,1589,1586,89,1324,187,1827,608,1759,1855,1228,875,1201,590,1400,599,1964,262,682,1884,120,462,731,1058,1008,1960,1208,973,1154,131,279,393,1534,1189,1148,1532,1679,567,1346,1366,578,1294,1985,783,841,709,703,197,1104,358,523,692,141,414,1332,299,646,468,1205,1515,1158,1032,1300,628,1096,597,534,1968,381,1600,755,667,1597,1120,1644,16,1178,675,1046,29,575,1946,973,291,884,1775,1968,692,893,285,1079,140,1020,459,1137,1848,123,31,1571,286,625,1023,1480,1390,1953,776,166,127,729,824,863,11,713,444,1874,1651,1937,233,1832,1941,1026,1555,309,1978,1148,203,1487,298,587,1112,1118,531,1391,1476,1476,1069,66,110,1542,827,793,1400,117,1716,131,677,102,895,668,381,646,410,1607,830,401,318,731,1960,1582,1878,746,868,1065,1906,1438,507,1233,1893,1637,1378,1797,1981,1451,551,306,373,1727,876,1561,1302,228,1721,662,1115,476,1068,894,604,1740,1332,183,146,1136,1733,334,767,1306,571,1768,710,1649,1239,984,1611,1562,332,455,868,677,680,1191,1309,1548,661,667,1732,758,1632,1359,435,926,1827,1583,316,574,1548,878,631,1318,1027,634,1022,364,9999};
#pragma romdata

#pragma udata bigdata
int vetorAuxiliar[TAMANHO+1];
#pragma udata



void main() {
inicializarSerial();

menuInicial();
//Limpar sujeira no buffer da serial.
sprintf(opcao,"\r\r\r");
getsUSART(opcao, 1);
putrsUSART("\r \n");
switch(opcao){
case '1': ssf(TAMANHO, CABECA_DA_FILA);
break;
case '0': sprintf(mensagem, "Reset...\n\r");
putsUSART(mensagem);
Reset();
break;
default: sprintf(mensagem, "Opcao invalida\n\r");
putsUSART(mensagem);
}
}

/*Configura e habilita a comunicação serial*/
void inicializarSerial()
{
OpenUSART( USART_TX_INT_ON &
USART_RX_INT_ON &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,51);
//putrsUSART("HELLO! ");
}

void imprime(){
int i;
for(i= 0; i < TAMANHO;i ++){
itoa(vetorAuxiliar, numero);
putsUSART(numero);
putrsUSART(" ");

}
putrsUSART("|\n ");

}

void ssf(int tamanhoVetor, int cabecaDaFila){

int deslocamento=0;
int auxiliaSwap=0;
int menorDeslocamento=0;
int posicaoDeMenorDeslocamento=0;
int totalDescolamentos=0;

int i = 0;
int j = 0;

/**
* Insere a cabeca da fila na primeira posicao do vetor auxiliar
**/
vetorAuxiliar[0]=cabecaDaFila;

/**
* Copia o vetor principal em um vetor auxilia, garantindo que o vetor original
* não seja modificado.
**/
for(i=1;i<=tamanhoVetor;i++)
vetorAuxiliar=vetor[i-1];

/**
* Remove do vetor auxiliar a duplicidade da cabeca
**/
i = 1;
while (vetorAuxiliar != ULTIMO_DA_FILA)
{
if (vetorAuxiliar == CABECA_DA_FILA)
{
vetorAuxiliar = vetorAuxiliar[i + 1];
if (vetorAuxiliar != ULTIMO_DA_FILA)
vetorAuxiliar[i + 1] = CABECA_DA_FILA;
}
i++;
}


/**
* A partir da cabeca do vetor, faz comparacao buscando o menor deslocamento,
* ao encontrar, leva-o para o inicio do vetor.
**/
for(i = 0; i < tamanhoVetor; i++){
menorDeslocamento = 10000;
for(j = i+1; j <= tamanhoVetor; j++){
if(vetorAuxiliar > vetorAuxiliar[j])
deslocamento = vetorAuxiliar - vetorAuxiliar[j];
else
deslocamento = vetorAuxiliar[j] - vetorAuxiliar;
if(deslocamento < menorDeslocamento){
menorDeslocamento = deslocamento;
posicaoDeMenorDeslocamento = j;
}
}

totalDescolamentos += menorDeslocamento;

// SWAP
auxiliaSwap = vetorAuxiliar[i+1];
vetorAuxiliar[i+1] = vetorAuxiliar[posicaoDeMenorDeslocamento];
vetorAuxiliar[posicaoDeMenorDeslocamento] = auxiliaSwap;

}
putrsUSART("Terminou");
//imprime vetor saida
imprime();
}

void menuInicial(){
sprintf(mensagem, "1 - Imprimir SSF\n\r");
putsUSART(mensagem);
sprintf(mensagem, "2 - Imprimir SCAN \n\r");
sprintf(mensagem, "0 - Reset\n\r");
putsUSART(mensagem);
}

 

CÓDIGO REFERENTE AO MAPED LINKER

// File: 18f4550_g.lkr


// Generic linker script for the PIC18F4550 processor

#DEFINE _CODEEND _DEBUGCODESTART - 1
#DEFINE _CEND _CODEEND + _DEBUGCODELEN
#DEFINE _DATAEND _DEBUGDATASTART - 1
#DEFINE _DEND _DATAEND + _DEBUGDATALEN

LIBPATH .

#IFDEF _CRUNTIME
#IFDEF _EXTENDEDMODE
FILES c018i_e.o
FILES clib_e.lib
FILES p18f4550_e.lib

#ELSE
FILES c018i.o
FILES clib.lib
FILES p18f4550.lib
#FI

#FI

#IFDEF _DEBUGCODESTART
CODEPAGE NAME=page START=0x0 END=_CODEEND
CODEPAGE NAME=debug START=_DEBUGCODESTART END=_CEND PROTECTED
#ELSE
CODEPAGE NAME=page START=0x0 END=0x7FFF
#FI

CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED

#IFDEF _EXTENDEDMODE
DATABANK NAME=gpre START=0x0 END=0x5F
#ELSE
ACCESSBANK NAME=accessram START=0x0 END=0x5F
#FI

DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1FF
DATABANK NAME=gpr2 START=0x200 END=0x2FF

#IFDEF _DEBUGDATASTART
DATABANK NAME=gpr3 START=0x300 END=_DATAEND
DATABANK NAME=dbgspr START=_DEBUGDATASTART END=_DEND PROTECTED
#ELSE //no debug
DATABANK NAME=gpr3 START=0x300 END=0x3FF
#FI

DATABANK NAME=bigdata START=0x400 END=0x4FF PROTECTED
DATABANK NAME=bigdata START=0x500 END=0x5FF PROTECTED
DATABANK NAME=bigdata START=0x600 END=0x6FF PROTECTED
DATABANK NAME=usb7 START=0x700 END=0x7FF PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED


#IFDEF _CRUNTIME
SECTION NAME=CONFIG ROM=config
#IFDEF _DEBUGDATASTART
STACK SIZE=0x100 RAM=gpr2
#ELSE
STACK SIZE=0x100 RAM=gpr3
#FI
#FI

SECTION NAME=BIGDATA RAM=bigdata

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja um exemplo que que usei ha muito tempo num projeto que usava vetores para setar vários PWM por Software.

// $Id: 18f2550.lkr,v 1.3 2004/08/23 18:08:22 curtiss Exp $// File: 18f2550.lkr// Sample linker script for the PIC18F2550 processorLIBPATH .FILES c018i.oFILES clib.libFILES p18f2550.libCODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTEDCODEPAGE   NAME=page       START=0x2A           END=0x7FFFCODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       PROTECTEDCODEPAGE   NAME=config     START=0x300000       END=0x30000D       PROTECTEDCODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTEDCODEPAGE   NAME=eedata     START=0xF00000       END=0xF000FF       PROTECTEDACCESSBANK NAME=accessram  START=0x0            END=0x5F	DATABANK   NAME=pwm        START=0x60           END=0x18C	       	  //DATABANK   NAME=gpr1       START=0x100          END=0x1FFDATABANK   NAME=gpr2       START=0x18D          END=0x2FFDATABANK   NAME=gpr3       START=0x300          END=0x3FF		   DATABANK   NAME=usb4       START=0x400          END=0x4FF          PROTECTEDDATABANK   NAME=usb5       START=0x500          END=0x5FF          PROTECTEDDATABANK   NAME=usb6       START=0x600          END=0x6FF          PROTECTEDDATABANK   NAME=usb7       START=0x700          END=0x7FF          PROTECTEDACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF          PROTECTEDSECTION    NAME=CONFIG     ROM=configSECTION    NAME=PWM        RAM=pwmSTACK SIZE=0x100 RAM=gpr3

Este foi o Link que fiz para usar 300 bytes de RAM.

No Link alterado,criei a sessão PWM (DATABANK   NAME=pwm / SECTION    NAME=PWM    RAM=pwm),subscrevendo a sessão DATABANK NAME=gpr1.

 

No código inicializei os dados;

	#pragma udata PWM // seção que foi criada no link (PWM)unsigned char DUT[150]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};unsigned char DUT4[150]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};  #pragma udata // retorno a sessão padrão.

Criei as variáveis DUT e DUT4.

Percebe que se usar as sessões USBX,ficará sem usb.

Um detalhe é que só uso o C18.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só pra constar, não conheço o c18 e seus scripts. Pra mim não vale a pena conhecê-los no momento. ok?

 

Bom,  de acordo com seu post #6 não vejo relação com o título 'memória'. Penso que tens problemas mais básicos como limitação da sua versão do compilador pois p.ex. ele pede pra você comprar a versão completa, na linha 33 deve ter um errinho básico de sintaxe e etc. Sugiro dar uma analisada nisto primeiro.

Caso a solução do amigo vt resolva isso, kibon

 

Boa sorte

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal, obrigada pela ajuda e pelas respostas. Foi bem interessante essa fase com pic. Acabei apredendo muito. A lógica do meu algoritmo final ficou bastante diferente da primeira que mandei para vocês e trabalhei com muita coisa diferente. No mais, obrigada :)

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×