Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Eddy_Em »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3833032#p3833032"]На ARM нужно 10 раз подумать прежде чем так делать, чтобы исключить невыровненный доступ там где его нет и в HardFault не улететь. Можно, но с головой![/uquote]
++
Еще memcpy опасен. Я пару раз нарывался. Вроде код правильный, а в хардфолт уходит. Оказывается, пытался при помощи memcpy копировать часть строки (а memcpy, видимо, оптимизировать пытался и копировать по 4 байта "за присест"). В общем, если строки нужно копировать, то есть strcpy — она не пытается char'ы как uint32_t копировать…
И в packed-структурах приходится очень аккуратно члены располагать.
[uquote="ARV",url="/forum/viewtopic.php?p=3833063#p3833063"]было бы конструктивно объяснить, как следует поступать, чтобы не нарваться. причем без привзяки к ARM[/uquote]
А смысл тогда о выравнивании думать?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
matrex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 24, 2012 14:02:39

Re: Вопросы по С/С++ (СИ)

Сообщение matrex »

Спасибо коллеги из помощь и советы по существу.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Eddy_Em писал(а):А смысл тогда о выравнивании думать?
смысл в понимании ограничений С++. я, например, крайне удивлен тем фактом, что функция, копирующая заданное (любое!) количество БАЙТ может куда-то уходить в хардфаулт - она не имеет права оптимизировать что-то так, как нельзя! если это где-то оговорено в стандарте С++, то об этом и стоит говорить на публичном форуме, а не о своей печальной судьбе...

что касаетс ARM, то С++ существует для бОльшего количества платформ, и для разрядностей тоже, чем единственное семейство ARM. поэтому и говорить надо об особенностях С++ для РАЗНЫХ платформ.

я вот еще был очень сильно удивлен, что union в С++ это совсем не тот же union, что в Си. но так и не понял, из-за чего эта разница НЕ ВСЕГДА бывает. тоже хотел бы узнать от сведущих людей...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Вопросы по С/С++ (СИ)

Сообщение NStorm »

[uquote="ARV",url="/forum/viewtopic.php?p=3833063#p3833063"]это чем-то отличается от предложенного мной?[/uquote]
Неа. Я до падения форума еще ответ написал, до того как ваш увидел.
Хотя посыл у меня был больше в том, что в таких случаях обычно делают массив структур, а не как ТЫ структуру из массивов (одинаковой размерности).

Добавлено after 5 minutes 46 seconds:
Без мемсета легко как я уже написал инициализировать нулевой локальной переменной, вроде dt = (struct rSENSORS){ 0 };.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Eddy_Em »

[uquote="ARV",url="/forum/viewtopic.php?p=3833080#p3833080"]смысл в понимании ограничений С++. я, например, крайне удивлен тем фактом, что функция, копирующая заданное (любое!) количество БАЙТ может куда-то уходить в хардфаулт - она не имеет права оптимизировать что-то так, как нельзя![/uquote]
Вообще-то, stdlib — он на то и stdlib, что там все более-менее оптимизировано, чтобы не приходилось каждому делать свой велосипед-квадратные-колеса для элементарных strcpy и т.п. А вот на микроконтроллеры, к сожалению, это не распространяется, т.к. оптимизация stdlib и других библиотек знать не знает, что есть какая-то говножелезка, разработчики которой были настолько долбанутыми ослами, что сделали обязательным требованием выравнивание переменных в памяти!

Это вам вопрос задавать надо не к разработчикам стандарта С++, а к ослам, которые заложили в архитектуру ARM такой огромный косяк!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3833080#p3833080"]смысл в понимании ограничений С++.[/uquote]Причём тут С++? Это вообще стандартные C-ные функции. Проблема не в языке, а в разработчике конкретной библиотеки и конкретного компилятора. Я же не просто так ему передаю параметр "-mcpu=cortex-m0" или "-mcpu=cortex-m4". Он должен это учитывать при компиляции/оптимизации. Это не ограничение языка!

Добавлено after 6 minutes:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3833090#p3833090"]Вообще-то, stdlib — он на то и stdlib, что там все более-менее оптимизировано, чтобы не приходилось каждому делать свой велосипед-квадратные-колеса для элементарных strcpy и т.п. А вот на микроконтроллеры, к сожалению, это не распространяется, т.к. оптимизация stdlib и других библиотек знать не знает, что есть какая-то говножелезка, разработчики которой были настолько долбанутыми ослами, что сделали обязательным требованием выравнивание переменных в памяти![/uquote]Это не так. stdlib должна правильно работать на любой железке. Библиотека оптимизируется под конкретную железку. То что в определённых условиях она сбоит - это недоработка, которую разработчик обязан исправлять, особенно если продукт платный.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

у меня вопрос на счет union в C++

Код: Выделить всё

typedef union{
   struct{
      uint8_t a;
      uint8_t b;
   };
   uint8_t c;
} my_type;
почему sizeof(my_type) == 3?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Не верь глазам своим
Изображение
Вложения
my_type.png
(32.93 КБ) 411 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Eddy_Em »

VladislavS, как по мне, так главная ДИЧЬ и недоработка — это требование к выравниванию переменных в ARM.
Вот уж где рукожопы поковырялись!
И почему разрабы stdlib должны за этими лосями-рукожопами косяки исправлять?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3833219#p3833219"]И почему разрабы stdlib должны за этими лосями-рукожопами косяки исправлять?[/uquote]А я это называю "не можешь срать - не мучай жопу". Есть архитектура чипа, будь добр её соблюдать, либо не берись. Вон на AVR вообще кривизна на кривизне и ничего, работает же всё.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

у меня вопрос по AVR-GCC
делаю вот такие вещи

Код: Выделить всё

typedef const __flash char fstr[];

typedef const __flash char* pfstr;

#define FSTR(x) (fstr){x}

typedef const __flash struct {
	pfstr		name;
	prop_type_t	id;
	bool*		value;
	pfstr 		items;
} prop_bool_t;				// определяет тип prop_bool_t

#define PROP_BOOL(n, v, i) &(prop_bool_t){.name = (fstr){n}, .id = PROP_BOOL, .value = &v, .items = i}
потом использую так

Код: Выделить всё

bool b1;

const __flash pfstr pwr_str[] = {FSTR("OFF"), FSTR("ON")};

const __flash void * const __flash prop_array[] = {
	PROP_BOOL("POWER", b1, pwr_str)
}
получаю варнинг initialization from incompatible pointer type [-Wincompatible-pointer-types] на pwr_str в макросе PROP_BOOL

не понимаю - что не так? вроде указатель на память программ... где ошибаюсь?

идея была такая: поле items структуры prop_bool_t должно содержать указатель на первый элемент находящегося во flash массива строк в памяти программ.

Добавлено after 45 seconds:
листинг показывает, что поля содержат правильные значения... но почему тип указателя не совпадает?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Вопросы по С/С++ (СИ)

Сообщение NStorm »

ARV, ну так у вас pwr_str получился массив из 2х строковых массивов, а .items такого не ожидает. Т.е. вы даете ссылку на массив из указателей на массивы fstr, а оно ждет ссылку сразу на fstr.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

не понял... массив указателей на __flash char, и item в структуре того же типа - указатель на __flash char...

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

Мой уютный бложик... заходите!
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Вопросы по С/С++ (СИ)

Сообщение NStorm »

Не массив указателей на __flash char у вас там, а массив указателей на другие указатели, которые только уже в свою очередь указывают на __flash char.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

const __flash const __flash char* pwr_str[] - откуда массив указателей на указатели?!

точнее const __flash char * const __flash pwr_str[]
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Код: Выделить всё

const __flash char str_on[] = "ON";
const __flash char str_off[] = "OFF";
const __flash char str_power_trm[] = "POWER_TRM";
const __flash char str_power_rcv[] = "POWER_RCV";
const __flash char __flash *strs_pwr[] = { str_on, str_off };

struct prop_bool_t{
   const char __flash *name;
   char  id;
   bool *value;
   const char __flash * __flash *items;
};

bool b1,b2;

const __flash prop_bool_t pwr[] = { { str_power_trm, 1, &b1, strs_pwr },  
                                    { str_power_rcv, 2, &b2, strs_pwr } };
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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

Мой уютный бложик... заходите!
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Вопросы по С/С++ (СИ)

Сообщение NStorm »

ARV, ну так вы ж его не разыменовали. PROP_BOOL("POWER", b1, *pwr_str)
Тоже самое у вас получается, без усложнений в виде флэша AVR: https://godbolt.org/z/xEwVFS
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Тут весь смак как раз во __flash :) Попросил компилятор показать как он будет добираться, например, к pwr[1].items[b2]

Код: Выделить всё

        LDI     R30, LOW((pwr + 12))
        LDI     R31, HIGH((pwr + 12))
        LPM     R18, Z+
        LPM     R19, Z
        LDS     R16, b2
        LDI     R17, 0
        LSL     R16
        ROL     R17
        ADD     R18, R16
        ADC     R19, R17
        MOVW    R31:R30, R19:R18
        LPM     R16, Z+
        LPM     R17, Z
Ух, забористо! Это AVR.
Ответить

Вернуться в «Разные вопросы по МК»