реклама на сайте
подробности

 
 
> Помогите пожалуйста..., с указателями!
HCHUNTER
сообщение Dec 29 2007, 18:41
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 29-12-07
Пользователь №: 33 732



К сожалению, я не очень силен в программировании, и видимо работа с указателями мне не до конца понятна...

Ситуация заключается в следующем.
Контроллер AVR Mega8, среда разработки CVAVR.
Имею 2 больших массива, размещенных во FLASH
const char symbol[3072]={...,...,... ... ... } //закодированные символы, 256 штук размером 8х12
const char str_array[44*27] = {...,...,... ... ... } //символьная строка для вывода в порт
...
//определяю 2 указателя для работы с этими массивами (чтобы работать с ними с максимальной скоростью)
const char * _ptr;
const char * _ptr1;

...

//далее в коде пишу
_ptr = &str_array[ххх]; //установить указатель в позицию ххх одного массива
_ptr1 = &symbol[ууу]; //установить указатель в позицию ууу второго массива


SPDR = *_ptr1 + (*_ptr*12); //здесь идет обращение к большому массиву через маленький, чтобы выбрать нужный байт


В итоге в порт выводится не то что нужно. Левак.
Чувствую, что работа с указателями у меня неверная в последней строчке написана ерунда. То есть в SPRD выводится совершенно не тот байт, что мне нужен.
Или может где-то можно по-русски почитать про указатели применительно к CVAVR ?




Совершенно аналогичное решение вопроса в WinAVR записано так:

SPDR = PRG_RDB(_ptr1 + (* _ptr++)*12);

На сколько я понимаю, эта функция позволяет считать байт по адресу в памяти, указанному суммой указателей. А как это же правильно записать в CVAVR ?

05.gif




---------------------------

Сам задал вопрос, сам видимо и отвечаю... yeah.gif

Вот такая должна быть запись в CVAVR:

SPDR = *(_ptr1 + (* _ptr++)*12);

Непосредственно результат по указателю возвращается так: *(указатель) .
соответственно, моя ошибка была в том, что я неверно взял в скобки разные части выражения.

Никто ничего не добавит к моим умозаключениям...? 05.gif

Сообщение отредактировал HCHUNTER - Dec 29 2007, 18:44
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
Сергей Борщ
сообщение Dec 29 2007, 19:25
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(HCHUNTER @ Dec 29 2007, 20:41) *
Никто ничего не добавит к моим умозаключениям...? 05.gif

Фактически вы имеете двумерный массив, 256 символов по 12 байт. Почему бы его и не объявить как двумерный массив?
Код
const char symbol[][12]=
{
    {12 байт},
    {12 байт},
    {12 байт},
};
const char str_array[][44] =
{
    "string1, 44 symbols long",
    "string2, 44 symbols long",
    "string3, 44 symbols long",
    "string4, 44 symbols long",
};
Вторую размерность можно указать, а можно не указывать - компилятор сам посчитает.
Дальше вы можете работать с этим массивом, и первую размерность компилятор подставит сам. Если у вас изменится размер символа - вам надо будет только изменить описание массива (при условии, что в коде вы используете sizeof()).
Код
ptr2 = &symbol[str_array[xxx][yyy]];
for(i = 0; i < sizeof(symbol[0]); ++i )
     SPDR = *ptr2++;
Вы можете также объявить новый тип
Код
typedef const unsigned char symbol_t[12];
тогда массив знакогенератора можно объявить через этот тип:
symbol_t symbol[]=
{
    {12 байт},
    {12 байт},
    {12 байт},
};
и в цикле использовать размерность этого типа:
for(i = 0; i < sizeof(symbol_t); ++i )


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
HCHUNTER
сообщение Dec 29 2007, 19:57
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 29-12-07
Пользователь №: 33 732



Спасибо за дельные советы!
...буду думать дальше
Go to the top of the page
 
+Quote Post
HCHUNTER
сообщение Dec 31 2007, 12:25
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 29-12-07
Пользователь №: 33 732



Сорри за дурацкий вопрос...
А как из обработчика прерывания вернуться в нужную точку, а не в точку, где случилось прерывание...? laughing.gif
Go to the top of the page
 
+Quote Post
bzx
сообщение Dec 31 2007, 12:53
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Цитата(HCHUNTER @ Dec 31 2007, 15:25) *
Сорри за дурацкий вопрос...
А как из обработчика прерывания вернуться в нужную точку, а не в точку, где случилось прерывание...? laughing.gif

При выходе из обработчика прерывания в стек занести адрес нужной точки.


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
HCHUNTER
сообщение Dec 31 2007, 13:51
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 29-12-07
Пользователь №: 33 732



А если на C++ пишу?
Go to the top of the page
 
+Quote Post
HCHUNTER
сообщение Dec 31 2007, 15:47
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 29-12-07
Пользователь №: 33 732



Конкретно интересует написание в CVAVR.
Как указать, куда возвращаться из функции-обработчика прерывания?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 31 2007, 16:20
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(HCHUNTER @ Dec 31 2007, 17:47) *
Как указать, куда возвращаться из функции-обработчика прерывания?

Настоятельный совет - возвращайтесь туда, куда господом богом предписано возвращаться. Все остальное делайте в рамках прадигм программирования. Перед использованием трюков надо 49 раз подумать, ну и естественно обладать при этом достаточным опытом.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01416 секунд с 7
ELECTRONIX ©2004-2016