2016-08-03 4 views
2

Я разработал код для ПОС, и я доволен им. Проблема заключается в том, что мои переменные попадают в оперативную память, и они почти полны.Функция C на основе указателя на const

Я попытался с const перед массивом данных, но мне не удалось выполнить более позднюю функцию на основе указателя на const array.

Может ли кто-нибудь показать мне, как определить этот указатель?

Вот что я сейчас:

#define type  unsigned int8 
#define memType const type 
memType n_006 = 2; 
type l_006[n_006]={0x03, 0xFF}; 

Функция:

void writeLine(type adress, type *send, int8 numS) 
{ 
    int8 i = 0; 
    i2c_start(); 
    i2c_write(adress); 
    for(i = 0; i < numS; i++) 
    { 
     int8 toSend = send[i]; 
     i2c_write(toSend); 
    } 
    i2c_stop(); 
} 

И главная:

writeLine(a1, &l_006[0], n_006); 

Главная цель состоит в том, чтобы иметь данные, сохраненные в ПЗУ, что я догадка может быть пожертвована со стороны const, но я действительно не смог сделать это правильно.

Спасибо заранее, Крис

+0

Failed как? Ошибка компилятора? Ошибка выполнения? Быть конкретной. – user694733

+0

Почему вы используете '# define' вместо' typedef' –

+0

Некоторые компиляторы PIC обязывают 'const' передавать данные неконсолину с помощью таких функций, как' memcpy() '.Не удалось отправить код и описать, как он сработал. – chux

ответ

1

Ваш компилятор может поддерживать дополнительные спецификаторы, которые явно назначаемые для хранения глобалов (EEPROM и т.д.).

Также гораздо лучше использовать typedef вместо макроса.

typedef unsigned int8 type, *ptype; 
typedef const type memType; 
memType n_006 = 2; 
type l_006[n_006]={0x03, 0xFF}; 

Кроме того, вы можете избавиться от n_006 вообще, просто использовать хорошо известный sizeof трюк:

writeLine(a1, l_006, sizeof l_006/sizeof l_006[0]); 
+0

Хотя typedef над макросом, безусловно, предпочтительнее, он не должен быть источником проблемы OP. Кроме того, скрытие типа указателя за typedef всегда уродливо. – user694733

+0

Не работает. На строке: typedef const type memType; У меня есть ошибка «Ожидание an =» –

+0

@ user694733 «... скрытие типа указателя за typedef всегда уродливо ...» ИМО это вопрос вкуса. – Sergio

0

Как говорит Serhio, проверить специальные определители компилятора. Например на XC8 компилятора (который не имеет int8, так что я должен использовать символ)

const unsigned char ylist[] = { 0x03, 0xFF }; 

Формирует

stringdir: 
    movlw high stringdir 
    movwf 10 
    movf 4,w 
    incf 4,f 
    addwf 2,f 
__stringbase: 
    retlw 0 
__end_of__stringtab:  
_ylist: 
    retlw 3 
    retlw 255 
__end_of_ylist; 

Но используя ЭСППЗ ключевого слова вместо сопзЬ

eeprom unsigned char ylist[] = { 0x03, 0xFF }; 

_ylist: 
;initializer for _ylist 
    db 3 
    db 255 

Он использует половину пространства и не имеет процедуры преобразования строк. Вероятно, он работает намного быстрее.

0

Я использую CCS C Compiler

Я использовал:

#define type  unsigned int8 
#define memType const type 
#define tabType rom type 

и работал

решаемые