Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Chipcon CC1010. Пытаюсь запихнуть переменные в pdata. Дошел уже до исступления...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Kenelm
Среда Keil uVision2. Поверх поставлен CC1010IDE. Выбрано устройство "CC1010_debug".

Пытаюсь разместить массив в pdata и создать на него указатель, расположенный в data.

char pdata massiv[32];
char pdata * data ptr_massiv = massiv;

code void main()
{
*ptr_massiv = 0xAA;
*(ptr_massiv + 1) = 0xBB;
}

В результате при дебаггинге в окне "Watch" смотрю на содержание массива "massiv" - пустой (все элементы равны нулю). Смотрю на *ptr_massiv и *(ptr_massiv + 1) - отображается, что там содержится 0xAA и 0xBB, соответственно!!! При этом ptr_massiv указывает именно на "голову" массива "massiv"! wacko.gif

В настройках проекта стоит:
Memory model: Compact (variables in PDATA)
Стоит галка напротив "Use On-chip XDATA"

В startup.a51:
PPAGEENABLE EQU 1
PPAGE EQU 0
PPAGE_SFR DATA 092H

PS. Если массив запихнуть в data или xdata, то все работет ок.
Палыч
Я плохо знаю CC1010. Возможно, нужно установить некий бит какого-то регистра, чтобы было возможно обращение к внутренней памяти. Возможно, по-умолчанию, обращение идёт в внешней памяти, которой нет?
AndreyS
Цитата(Kenelm @ Oct 29 2011, 19:25) *
Среда Keil uVision2. Поверх поставлен CC1010IDE. Выбрано устройство "CC1010_debug".
В результате при дебаггинге в окне "Watch" смотрю на содержание массива "massiv" - пустой (все элементы равны нулю). Смотрю на *ptr_massiv и *(ptr_massiv + 1) - отображается, что там содержится 0xAA и 0xBB, соответственно!!! При этом ptr_massiv указывает именно на "голову" массива "massiv"! wacko.gif

PS. Если массив запихнуть в data или xdata, то все работет ок.


Добрый день.

Вы смотрели содержимое массива именно в Watch? Проверьте содержимое в окне memory, и введите там адрес вашего массива (только префикс типа памяти не забудьте). Если там верная информация (а она должна быть именно такой, потому что через ваши указатели ptr_massiv информация отображается правильная), то не беспокойтесь. Это глюк кейла. Я помню напарывался на подобный эффект, когда в ватчах отображалось не то что там реально находилось. Так что дамп ОЗУ лучший инструмент. Ну и посмотрите карту памяти, реально переменная попала в нужную область или нет (это как второй инструмент контроля над компилятором).

Удачи.
Палыч
Поскольку всё хорошо работает с xdata, но не работает с pdata, то тут какая-то "беда" с командами типа "movx @ri, a".
Вот что нашел в DS:
Цитата
The instructions MOVX A, @Ri and MOVX @Ri, A moves data to (from) the accumulator, from (to) the address given by the memory page address register MPAGE and the register Ri (R0 or R1). MPAGE gives the 8 most significant address bits, while the register Ri gives the 8 least significant bits. In many 8051 implementations, this type of external RAM access is performed using P2 to give the most significant address bits. Existing software may therefore have to be adapted to make use of MPAGE instead of P2.
Kenelm
Цитата(Палыч @ Oct 31 2011, 10:31) *
Поскольку всё хорошо работает с xdata, но не работает с pdata, то тут какая-то "беда" с командами типа "movx @ri, a".
Вот что нашел в DS:

Угу, я на эту фразу много раз медитировал. sm.gif MPAGE по умолчанию сбрасывается в 0х00. Ну а мне и надо писать в начальную страницу xdata.

Цитата(AndreyS @ Oct 31 2011, 10:16) *
Вы смотрели содержимое массива именно в Watch? Проверьте содержимое в окне memory, и введите там адрес вашего массива (только префикс типа памяти не забудьте). Если там верная информация (а она должна быть именно такой, потому что через ваши указатели ptr_massiv информация отображается правильная), то не беспокойтесь.


В том-то все и дело, что смотрел и так и так. "ptr_massiv" указывает на "X:00". Смотрю память по этому адресу - пусто! Адрес &massiv[0] - "X:00". При этом *ptr_massiv = 0xAA, а massiv[0] = 0x00. Я близок к безумию...

Цитата(AndreyS @ Oct 31 2011, 10:16) *
Ну и посмотрите карту памяти, реально переменная попала в нужную область или нет (это как второй инструмент контроля над компилятором).

Память большущая - вручную тяжко её всю шерстить...
Палыч
В Keil про СС1010 есть ещё загадочная фраза "Full System Debugging with Keil 5Vision". Что такое "5Vision"? Букву "мю" не смогли "нарисовать"? Или имеется в виду какая-то конкретная версия?
Kenelm
Цитата(Палыч @ Oct 31 2011, 10:48) *
В Keil про СС1010 есть ещё загадочная фраза "Full System Debugging with Keil 5Vision". Что такое "5Vision"? Букву "мю" не смогли "нарисовать"? Или имеется в виду какая-то конкретная версия?


С этим вообще отдельная песТня. 5Vision - это походу все-таки uVision. Но! Симулятор Keil по умолчанию некорректно работает с CC1010 (не отображается второй UART, некоторые прерывания и т. д.). Для полноценной симуляции поверх Кейла нужно ставить пришлепку CC1010IDE (бесплатно валяется на сайте Texas Instruments). Однако CC1010IDE совместим только со вторым Кейлом. sad.gif
Палыч
Цитата(Kenelm @ Oct 31 2011, 10:54) *
С этим вообще отдельная песТня.

Так, может быть, симулятор в этой части - "кривой"? Я, вообще, слабо симуляторам доверяю...
редактор
Поскольку в настройках стоит по умолчанию модель Compact, то по умолчанию переменные размещаются в PDATA.
char pdata * data ptr_massiv = massiv; // размещается по умолчанию
Чтобы запихнуть ее в DATA надо указать принудительно тип памяти
data char pdata *data ptr_massiv = massiv; // принудительно в дата
Размещение глобальных переменных можно найти в MAP-файле.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.