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

 
 
 
Reply to this topicStart new topic
> DATA_ALIGN pragma, Что-то я туплю :)
sigmaN
сообщение Nov 5 2009, 23:29
Сообщение #1


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Итак, имеем сигнальник техаса серии C2000.
Напомню, что "отличительной особенностью" данного чуда является 16ти битный char(кстати int тоже 16битный ).
Также, следует напомнить, что sizeof(char) == 1 == sizeof(int);
Память адресуется словами(по 2 байта), отдельный байт адресовать никак нельзя sad.gif

Далее, требование по выравниванию:
Цитата
The C28x CPU expects memory wrappers or peripheral-interface logic to align
any 32-bit read or write to an even address. If the address-generation logic
generates an odd address, the CPU must begin reading or writing at the previous
even address.


Вопрос первый: как этот зверь работает с 64 битными переменными?
Код
typedef unsigned long long uint64_t;
Как сие разместится в памяти(я имею в виду выравнивание)?

Вопрос второй: хочу заранее выровнять char буфер, чтобы к его элементам при желании можно было обращаться как к имеющим тип uint64_t.
Цитата
The DATA_ALIGN pragma aligns the symbol to an alignment boundary.
The alignment boundary is the maximum of the symbol's default alignment value or the value of the constant in bytes.
The constant must be a power of 2.
The syntax of the pragma in C is:
#pragma DATA_ALIGN ( symbol , constant );

Пока не могу толком осознать смысл этого: "The alignment boundary is the maximum of the symbol's default alignment value or the value of the constant in bytes."
Может кто-нибудь на пальцах объяснить? Что-то никак не могу увязать maximum of the symbol's default alignment value or the value of the constant in bytes unsure.gif
И что такое вообще symbol's default alignment value? И почему в предложении мы видим операцию ИЛИ(or) со значением constant in bytes? Вот ей и Богу как-то не вяжется sad.gif
Саму суть выравнивания я понимаю, но вот к примеру как ответить на второй вопрос? Следует ли мне передать прагме 4 в качестве constant?
Мыслю исходя из того, что sizeof(uint64_t)==4;


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 6 2009, 08:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Вопрос первый: как этот зверь работает с 64 битными переменными?
Код
typedef unsigned long long uint64_t;
Как сие разместится в памяти(я имею в виду выравнивание)?
Если у него (проца) есть аппаратная поддержка таких данных, то по границе 64х битов (т.е. по границе 4х слов). Если нет, то видимо по границе 2х слов.
Цитата
Вопрос второй: хочу заранее выровнять char буфер, чтобы к его элементам при желании можно было обращаться как к имеющим тип uint64_t.
Засунь его в union с uint64_t:
Код
union {
char buffer[<your size>];
uint64_t just_for_align;
};

Цитата
Пока не могу толком осознать смысл этого: "The alignment boundary is the maximum of the symbol's default alignment value or the value of the constant in bytes."

Это означает, что компилятор будет выравнивать переменную на заданную границу (в байтах) или на ту величину, на которую эта переменная должна была быть выровнена без этой прагмы (что больше). Т.е. заставить выровнять int32_t на границу байта с помощью этой прагмы нельзя - компилятор ее просто молча проигнорирует, а вот выровнять на границу 8ми байтов (например) можно.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 6 2009, 22:51
Сообщение #3


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Т.е. заставить выровнять int32_t на границу байта с помощью этой прагмы нельзя - компилятор ее просто молча проигнорирует, а вот выровнять на границу 8ми байтов (например) можно.
Спасибо. Именно то, что мне нужно было услышать, чтобы разобраться.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

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

 


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


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