Jump to content

    
Sign in to follow this  
Kenelm

Chipcon CC1010. Пытаюсь запихнуть переменные в pdata. Дошел уже до исступления...

Recommended Posts

Среда 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:

 

В настройках проекта стоит:

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, то все работет ок.

Edited by Kenelm

Share this post


Link to post
Share on other sites

Я плохо знаю CC1010. Возможно, нужно установить некий бит какого-то регистра, чтобы было возможно обращение к внутренней памяти. Возможно, по-умолчанию, обращение идёт в внешней памяти, которой нет?

Share this post


Link to post
Share on other sites
Среда Keil uVision2. Поверх поставлен CC1010IDE. Выбрано устройство "CC1010_debug".

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

 

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

 

Добрый день.

 

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

 

Удачи.

 

Share this post


Link to post
Share on other sites

Поскольку всё хорошо работает с 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.

Share this post


Link to post
Share on other sites
Поскольку всё хорошо работает с xdata, но не работает с pdata, то тут какая-то "беда" с командами типа "movx @ri, a".

Вот что нашел в DS:

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

 

Вы смотрели содержимое массива именно в Watch? Проверьте содержимое в окне memory, и введите там адрес вашего массива (только префикс типа памяти не забудьте). Если там верная информация (а она должна быть именно такой, потому что через ваши указатели ptr_massiv информация отображается правильная), то не беспокойтесь.

 

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

 

Ну и посмотрите карту памяти, реально переменная попала в нужную область или нет (это как второй инструмент контроля над компилятором).

Память большущая - вручную тяжко её всю шерстить...

Edited by Kenelm

Share this post


Link to post
Share on other sites

В Keil про СС1010 есть ещё загадочная фраза "Full System Debugging with Keil 5Vision". Что такое "5Vision"? Букву "мю" не смогли "нарисовать"? Или имеется в виду какая-то конкретная версия?

 

Share this post


Link to post
Share on other sites
В Keil про СС1010 есть ещё загадочная фраза "Full System Debugging with Keil 5Vision". Что такое "5Vision"? Букву "мю" не смогли "нарисовать"? Или имеется в виду какая-то конкретная версия?

 

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

Share this post


Link to post
Share on other sites
С этим вообще отдельная песТня.

Так, может быть, симулятор в этой части - "кривой"? Я, вообще, слабо симуляторам доверяю...

 

Share this post


Link to post
Share on other sites

Поскольку в настройках стоит по умолчанию модель Compact, то по умолчанию переменные размещаются в PDATA.

char pdata * data ptr_massiv = massiv; // размещается по умолчанию

Чтобы запихнуть ее в DATA надо указать принудительно тип памяти

data char pdata *data ptr_massiv = massiv; // принудительно в дата

Размещение глобальных переменных можно найти в MAP-файле.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this