Jump to content

    
Sign in to follow this  
eav1978

Вопрос по указателям

Recommended Posts

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

 

Подозреваю, что вопрос задан коряво, так что не обессудьте.

Share this post


Link to post
Share on other sites
Подозреваю...

Подозреваю, что лучше, чем писать в раздел "Операционные системы", просто прочитать соответствующий раздел в учебнике по "C". Тему перенес.

*(short *)&RegLcdData[0] = 0x1234;

Share this post


Link to post
Share on other sites
*(short *)&RegLcdData[0] = 0x1234;

 

Это будет выглядеть как одно действие только со стороны текста программы. Проц то выполняет не Си-шную программу, а асм. И для него все равно что один short что два char это будет выполнятся за несколько действий.

Хотя, если проц 16 или 32битный ХЗ...

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

3. каждый символ в комментариях это тоже команда nop

Share this post


Link to post
Share on other sites
Проц то выполняет не Си-шную программу, а асм. И для него все равно что один short что два char это будет выполнятся за несколько действий.

Хотя, если проц 16 или 32битный ХЗ...

Если MCU с разрядностью выше 8, то при работе с невыравненными структурами и/или при обращении к структуре без выравнивания на границу слова могут быть весьма забавные эффекты. Если не подозревать про них, то можно долго ломать голову над непонятными глюками "самопроизвольного" изменения данных в структуре.

Share this post


Link to post
Share on other sites

А как структуры выравнивать средствами языка Си???Или проще по возможности отказаться от использования переменных, разрядность которых меньше разрядности процессора???

Share this post


Link to post
Share on other sites
А как структуры выравнивать средствами языка Си???
J,sxyj в препроцессоре есть соответствующая #pragma

Например

#pragma pack(2)

#pragma pack()

Или проще по возможности отказаться от использования переменных, разрядность которых меньше разрядности процессора???
Нужно просто понимать как 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.

Share this post


Link to post
Share on other sites
*(short *)&RegLcdData[0] = 0x1234;

 

это сработает когда нужно "одновременно" изменить четный и не четный элементы массива.

А если нужно не четный и четный элементы массива?

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

Share this post


Link to post
Share on other sites
это сработает..

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

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