Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

MCC18 and rom const char
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=3387
Страница 1 от 1

Автор:  [ Пет Дек 08, 2006 1:37 pm ]
Заглавие:  MCC18 and rom const char

Един проект преработих от CCS C на MCC18, общо взето с учебна цел. Възникна един странен проблем с разполагането на стрингове или char таблици в паметта за данни и програмната памет , въпреки че правя нещата по MPLAB_C18_Users_Guide_51288j.pdf

Примерно, в следния код:
Код:
#include <p18f2525.h>      // 24576 flash, 3986 SRAM, 1024 EEPROM
#include <stdlib.h>
#include <string.h>
//#include <i2c.h>            // I2C library functions
#include <pwm.h>            // PWM library functions
#include <adc.h>            // ADC library functions
#include <portb.h>          // PORTB library function
#include <timers.h>         // Timer library functions
#include <delays.h>

#pragma config OSC = HS
#pragma config PWRT = OFF
#pragma config BOREN = OFF
#pragma config WDT = OFF
#pragma config MCLRE = ON
#pragma config PBADEN = OFF
#pragma config DEBUG = ON
#pragma config LVP = OFF

#pragma romdata eedata = 0xF00000   // Начало на данните за EEPROM
rom const char szString1[] = "String1";   // String1 в EEPROM-а за данни, ok.
rom const char *szString2 = "String2";   // String2 също трябва да е в EEPROM-а, но
                              // MCC18 го поставя в програмната памет ???
rom const char *szString3 = "String3";   // String3 също като String2 e в програмната памет ???
rom const char szString4[8] = "String4";// String4 обаче се намира в EEPROM-a, ok.

#pragma romdata    // String5 в програмната памет, ok
rom const char szString5[20] = "String5";
rom const char szString6[] = "String6";
rom const char *szString7[] = "String7";

void main(void)   {

char c;

   while( 1 ) {
      c = szString1[0];
      c = szString2[0];
      c = szString3[0];
      c = szString4[0];
      c = szString5[0];
   }

}


String1 и String4 се разполагат правилно в паметта за данни, но String2 и String3 се разполагат в програмната памет. Защо ? Нали съм задал
Код:
#pragma romdata eedata = 0xF00000   // Начало на данните за EEPROM

т.е., дефинирал съм секция eedata.

След директивата:
Код:
#pragma romdata    // String5 в програмната памет, ok


String5,String6 & String7 се разполагат правилно в програмната памет, въпреки че ги дефинирам по различни начини. Излиза че за паметта за данни, MCC18 е "чувствителен" как ще се дефинират данните. Да не е детска болест ? От 2000г. го има, чак пък такива дреболии да не са изгладени ....

Автор:  Gogo [ Пет Дек 08, 2006 9:21 pm ]
Заглавие: 

Пусни си една подробна симулация и ще видиш, че и от szString1 и szString4 не чете вярно, макар че са ти вярно разположени в еепрома.
Това:
Код:
c = szString1[0];
го замених с това:
Код:
c = szString1[6];
и на asm стана това:
Код:
   MOVLW   0x6
   MOVWF   TBLPTR, ACCESS
   MOVLW   0
   MOVWF   TBLPTRH, ACCESS
   TBLRD*
   MOVFF   TABLAT, c
   NOP
(направих "c" глобална променлива).
От тука ми идва на ум, че умните индийци са направили компилатора, като срещне четене от "rom" масив, направо почват с TBLPTR. Ама хич не ги интересува, че масива е на адрес 0xF00000
Та, май няма да стане по този начин...

Автор:  [ Съб Дек 09, 2006 12:20 am ]
Заглавие: 

Не съм разглеждал листинга в подробности, отделно чипльомик си имат функции за копиране на стрингове в RAM-а, предполагам, че поне те ще работят.

Прави впечатление, че един и същ сорс, компилиран с CCS заема 11% памет, а компилиран с MCC18 заема 22%. Голяма разлика, другата седмица ще разследвам на какво се дължи.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/