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

 
 
 
Reply to this topicStart new topic
> Вопрос по указателям
eav1978
сообщение May 20 2008, 20:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 57
Регистрация: 13-01-07
Из: Санкт-Петербург
Пользователь №: 24 409



Есть массив unsigned char RegLcdData[16]. Необходимо в одно действие присвоить значение соседним элементам массива RegLcdData[0] и RegLcdData[1] (или RegLcdData[2] и RegLcdData[3]), (или RegLcdData[2] и RegLcdData[3]), и т.д.

Подозреваю, что вопрос задан коряво, так что не обессудьте.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение May 20 2008, 20:23
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



В одно действие чего именно? (микропроцессора, языка С...)?


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 20 2008, 20:25
Сообщение #3


Гуру
******

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



Цитата(eav1978 @ May 20 2008, 22:18) *
Подозреваю...

Подозреваю, что лучше, чем писать в раздел "Операционные системы", просто прочитать соответствующий раздел в учебнике по "C". Тему перенес.
*(short *)&RegLcdData[0] = 0x1234;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
eav1978
сообщение May 20 2008, 21:03
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 57
Регистрация: 13-01-07
Из: Санкт-Петербург
Пользователь №: 24 409



Большое спасибо!
Go to the top of the page
 
+Quote Post
Amper25
сообщение May 20 2008, 21:09
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



Цитата
*(short *)&RegLcdData[0] = 0x1234;


Это будет выглядеть как одно действие только со стороны текста программы. Проц то выполняет не Си-шную программу, а асм. И для него все равно что один short что два char это будет выполнятся за несколько действий.
Хотя, если проц 16 или 32битный ХЗ...
Go to the top of the page
 
+Quote Post
bav
сообщение May 23 2008, 12:09
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 21-06-05
Из: Санкт-Петербург
Пользователь №: 6 184



когда пытаются пол программы разместить в одной строке, начинаю задумываться... может программист следует следующему правилу:

1. строка на С после компиляции будет выполняться за 1 такт

2. вместо табуляции будет вставлена команда nop

3. каждый символ в комментариях это тоже команда nop
Go to the top of the page
 
+Quote Post
rezident
сообщение May 23 2008, 12:22
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Amper25 @ May 21 2008, 03:09) *
Проц то выполняет не Си-шную программу, а асм. И для него все равно что один short что два char это будет выполнятся за несколько действий.
Хотя, если проц 16 или 32битный ХЗ...
Если MCU с разрядностью выше 8, то при работе с невыравненными структурами и/или при обращении к структуре без выравнивания на границу слова могут быть весьма забавные эффекты. Если не подозревать про них, то можно долго ломать голову над непонятными глюками "самопроизвольного" изменения данных в структуре.
Go to the top of the page
 
+Quote Post
kurtis
сообщение May 23 2008, 13:54
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



А как структуры выравнивать средствами языка Си???Или проще по возможности отказаться от использования переменных, разрядность которых меньше разрядности процессора???
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 23 2008, 14:16
Сообщение #9


Гуру
******

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



Цитата(bav @ May 23 2008, 14:09) *
..начинаю задумываться... может программист следует следующему правилу:

Подумали? smile.gif А вдруг нет?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение May 23 2008, 14:50
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(kurtis @ May 23 2008, 19:54) *
А как структуры выравнивать средствами языка Си???
J,sxyj в препроцессоре есть соответствующая #pragma
Например
Код
#pragma pack(2)

Код
#pragma pack()

Цитата(kurtis @ May 23 2008, 19:54) *
Или проще по возможности отказаться от использования переменных, разрядность которых меньше разрядности процессора???
Нужно просто понимать как CPU работает с памятью и к чему может приводить обращение к невыровненным структурам.
Допустим у вас 16-и разрядный CPU. Имеется массие из 5-и байт 1, 2, 3, 4, 5
Код
unsigned char mass[5]={1, 2, 3, 4, 5};

который по случайному стечению обстоятельств, расположился в памяти с нечетного адреса (без явного указания компилятор сделал так, как ему удобнее), т.е. невыровненных на границу машинного слова.
0x4001 0x01
0x4002 0x02
0x4003 0x03
0x4004 0x04
0x4005 0x05
Вы пытаетесь считать в 16-ти разрядную переменную третий и четвертый элемент байтового массива, думая, что в результате получите 0x0403.
Код
unsigned int var=(unsigned int *)&mass[2];

Но поскольку обращение к памяти возможно только по четному адресу, то в результате вы получите значение var 0x0302, либо 0x0504.
Go to the top of the page
 
+Quote Post
arttab
сообщение May 26 2008, 00:11
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Цитата
*(short *)&RegLcdData[0] = 0x1234;


это сработает когда нужно "одновременно" изменить четный и не четный элементы массива.
А если нужно не четный и четный элементы массива?
тут нужно думать что нужно сделать чтобы пока Вы меняете что то в массиве, не было считано не правильное значение другой частью программы. То есть сохранить целостность данных.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2008, 05:49
Сообщение #12


Гуру
******

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



Цитата(arttab @ May 26 2008, 02:11) *
это сработает..

Вопрос был про работу с указателями а не про обеспечение атомарности операции. Слово 'одновременно' вообще не поминалось Автором.


--------------------
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 Текстовая версия Сейчас: 27th July 2025 - 07:28
Рейтинг@Mail.ru


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