Отговори на тема  [ 3 мнения ] 
MCC18 and rom const char 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 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г. го има, чак пък такива дреболии да не са изгладени ....

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Дек 08, 2006 1:37 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Пусни си една подробна симулация и ще видиш, че и от 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
Та, май няма да стане по този начин...


Пет Дек 08, 2006 9:21 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Не съм разглеждал листинга в подробности, отделно чипльомик си имат функции за копиране на стрингове в RAM-а, предполагам, че поне те ще работят.

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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Съб Дек 09, 2006 12:20 am
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 3 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни