Kenelm 0 29 октября, 2011 Опубликовано 29 октября, 2011 (изменено) · Жалоба Среда 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"! В настройках проекта стоит: 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, то все работет ок. Изменено 29 октября, 2011 пользователем Kenelm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба Я плохо знаю CC1010. Возможно, нужно установить некий бит какого-то регистра, чтобы было возможно обращение к внутренней памяти. Возможно, по-умолчанию, обращение идёт в внешней памяти, которой нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyS 0 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба Среда Keil uVision2. Поверх поставлен CC1010IDE. Выбрано устройство "CC1010_debug". В результате при дебаггинге в окне "Watch" смотрю на содержание массива "massiv" - пустой (все элементы равны нулю). Смотрю на *ptr_massiv и *(ptr_massiv + 1) - отображается, что там содержится 0xAA и 0xBB, соответственно!!! При этом ptr_massiv указывает именно на "голову" массива "massiv"! PS. Если массив запихнуть в data или xdata, то все работет ок. Добрый день. Вы смотрели содержимое массива именно в Watch? Проверьте содержимое в окне memory, и введите там адрес вашего массива (только префикс типа памяти не забудьте). Если там верная информация (а она должна быть именно такой, потому что через ваши указатели ptr_massiv информация отображается правильная), то не беспокойтесь. Это глюк кейла. Я помню напарывался на подобный эффект, когда в ватчах отображалось не то что там реально находилось. Так что дамп ОЗУ лучший инструмент. Ну и посмотрите карту памяти, реально переменная попала в нужную область или нет (это как второй инструмент контроля над компилятором). Удачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба Поскольку всё хорошо работает с 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 0 31 октября, 2011 Опубликовано 31 октября, 2011 (изменено) · Жалоба Поскольку всё хорошо работает с 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. Я близок к безумию... Ну и посмотрите карту памяти, реально переменная попала в нужную область или нет (это как второй инструмент контроля над компилятором). Память большущая - вручную тяжко её всю шерстить... Изменено 31 октября, 2011 пользователем Kenelm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба В Keil про СС1010 есть ещё загадочная фраза "Full System Debugging with Keil 5Vision". Что такое "5Vision"? Букву "мю" не смогли "нарисовать"? Или имеется в виду какая-то конкретная версия? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kenelm 0 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба В Keil про СС1010 есть ещё загадочная фраза "Full System Debugging with Keil 5Vision". Что такое "5Vision"? Букву "мю" не смогли "нарисовать"? Или имеется в виду какая-то конкретная версия? С этим вообще отдельная песТня. 5Vision - это походу все-таки uVision. Но! Симулятор Keil по умолчанию некорректно работает с CC1010 (не отображается второй UART, некоторые прерывания и т. д.). Для полноценной симуляции поверх Кейла нужно ставить пришлепку CC1010IDE (бесплатно валяется на сайте Texas Instruments). Однако CC1010IDE совместим только со вторым Кейлом. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба С этим вообще отдельная песТня. Так, может быть, симулятор в этой части - "кривой"? Я, вообще, слабо симуляторам доверяю... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба Поскольку в настройках стоит по умолчанию модель Compact, то по умолчанию переменные размещаются в PDATA. char pdata * data ptr_massiv = massiv; // размещается по умолчанию Чтобы запихнуть ее в DATA надо указать принудительно тип памяти data char pdata *data ptr_massiv = massiv; // принудительно в дата Размещение глобальных переменных можно найти в MAP-файле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться