Вопросы по С/С++ (СИ)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Имхо, с атомарностью многострочность никак не связана.
А SBI, если я не ошибаюсь (давно асм в руки брал), инструкция одна, но работает именно в три этапа со всеми побочными эффектами.
А SBI, если я не ошибаюсь (давно асм в руки брал), инструкция одна, но работает именно в три этапа со всеми побочными эффектами.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
ARV, связана. Если a объявлена volatile, то для этих примеров компилятор сформирует разный код.
А если не volatile, то, скоре всего, код сфорируется одинаковый.
Код: Выделить всё
a = (a | ((1<<2) | (1<<0))) & ~((1<<4) | (1<<1));Код: Выделить всё
a |= ((1<<2) | (1<<0));
a &= ~((1<<4) | (1<<1));Re: Вопросы по С/С++ (СИ)
Нет там никаких 3х этапов, путаете что-то.
И конечно не совсем атомарно, будет всё-равно RMW, при этом M в 2 операции - AND, OR. Но запись будет именно в 1 операцию уже.
И конечно не совсем атомарно, будет всё-равно RMW, при этом M в 2 операции - AND, OR. Но запись будет именно в 1 операцию уже.
Re: Вопросы по С/С++ (СИ)
А вот такой вопросик. Как узнать длину строки в такой конструкции, не считая это вручную:
В ассемблере, транслятор может посчитать расстояние между метками, которыми ограничена строка, и так можно узнать ее длину. А тут как это делается?
Код: Выделить всё
const __flash char lcd_data[] = "строка";- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
Shuspano,
Код: Выделить всё
#define MY_STRING "строка"
#define MY_STRING_LEN sizeof(MY_STRING)
const __flash char lcd_data[] = MY_STRING;
Re: Вопросы по С/С++ (СИ)
Shuspano, просто sizeof(lcd_data) тоже будет работать.
Добавлено after 2 minutes 13 seconds:
Только ес-но реальный размер, с учетом терминирующего \0 в конца:
Возвращает 7 байт (stroka + \0). Если надо именно длину текста посчитать - sizeof() - 1 
Добавлено after 1 minute 8 seconds:
Ну и кодировку учитывайте при кириллице. Если вдруг в utf-8 запишите, будет 13 байт соотв, по 2 байта на символ.
Добавлено after 2 minutes 13 seconds:
Только ес-но реальный размер, с учетом терминирующего \0 в конца:
Код: Выделить всё
volatile uint8_t a = 1;
const __flash char lcd_data[] = "stroka";
int main() {
a = sizeof(lcd_data);
56: 87 e0 ldi r24, 0x07 ; 7
58: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__data_start>
Добавлено after 1 minute 8 seconds:
Ну и кодировку учитывайте при кириллице. Если вдруг в utf-8 запишите, будет 13 байт соотв, по 2 байта на символ.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
я сказал "напрямую", т.е. невозможно заранее предсказать, какой именно код получится от 1, 2 или 3 строчной записи одного и того же действия. например, в случае не-volatile может и 100500 строк превратиться в одну командуПростоНуб писал(а):связана
не поленился, поднял документы... ошибаетесь вы:NStorm писал(а):Нет там никаких 3х этапов, путаете что-то.
в конкретно вашем примере, как вам посоветовали, через sizeof. но вообще-то для этого есть в модуле avr/pgmspace.h специальная функция strlen_P, которая вычислит длину любой строки в памяти программ.Shuspano писал(а):Как узнать длину строки в такой конструкции, не считая это вручную:
- Вложения
-
- screenshot-file2.dzsc.com-2020.05.png
- (64.35 КБ) 411 скачиваний
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
ARV, это не о том. Полностью же написано всё. Речь идет о том, что в Status Flags нельзя с помощью инструкций CBI/SBI записать, т.к. они работают только с регистрами с 0х00 по 0х1F. Поэтому чтобы записать в Status Flags будет операция RMW - считается Status в один из этих регистров, затем он меняется с помощью CBI/SBI и записывается назад. Если будете менять регистр с 0x00 по 0x1F - он поменяется напрямую SBI/CBI атомарно и в одну операцию (которая 2 такта Fclk выполняется).
EDIT: Тут выше я уже сам запутался и не так перевел. Действительно, в некоторых старых AVR возможно эти инструкции так криво работали. В новых - неактуально, ниже в комментарии описал.
EDIT: Тут выше я уже сам запутался и не так перевел. Действительно, в некоторых старых AVR возможно эти инструкции так криво работали. В новых - неактуально, ниже в комментарии описал.
Последний раз редактировалось NStorm Чт май 14, 2020 18:33:14, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
как не о том?! написано же: берет все биты и записывает обратно установенные в 1 - чистое RMW
еще тут https://electronix.ru/forum/index.php?a ... ent=275082 было доказательство от уважаемого ReAl
Добавлено after 4 minutes 41 second:
кстати, RMW и атомарность тут тоже не совсем связаны. атомарность - это то, что не может быть прервано по ходу исполнения, так? RMW-операция не может быть прервана, но выолняется в три этапа, что может давать побочные эффекты, если состояние бита меняется от чтения регистра.
Добавлено after 2 minutes 22 seconds:
кстати, даже стало любопытно, что будет, если послать в USART байт 0xFF, а в обработчике прерываний сделать CBI UDR, 1 ?
хотя, конечно, это не совсем то, о чем мы тут говорим, но зато убедительно докажет RMW или не-RMW команда CBI/SBI 
еще тут https://electronix.ru/forum/index.php?a ... ent=275082 было доказательство от уважаемого ReAl
Добавлено after 4 minutes 41 second:
кстати, RMW и атомарность тут тоже не совсем связаны. атомарность - это то, что не может быть прервано по ходу исполнения, так? RMW-операция не может быть прервана, но выолняется в три этапа, что может давать побочные эффекты, если состояние бита меняется от чтения регистра.
Добавлено after 2 minutes 22 seconds:
кстати, даже стало любопытно, что будет, если послать в USART байт 0xFF, а в обработчике прерываний сделать CBI UDR, 1 ?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
Ну там не совсем так написано. Там написано просто, что некоторые биты очищаются путем записи 1 в них. Поэтому запись в такой флаг 1 на самом деле очищает его. По ссылке более интересно. Надо подробнее почитать, может я ошибаюсь.как не о том?! написано же: берет все биты и записывает обратно установенные в 1 - чистое RMW
Тут не выйдет ) UDR всего лишь буфер. Регистры там внутренние другие RXB, TXB. Поэтому UDR в принципе не поддерживает RMW. Потому что читать вы будете из другого регистра входящего буфера.кстати, даже стало любопытно, что будет, если послать в USART байт 0xFF, а в обработчике прерываний сделать CBI UDR, 1 ?хотя, конечно, это не совсем то, о чем мы тут говорим, но зато убедительно докажет RMW или не-RMW команда CBI/SBI
Добавлено after 10 minutes 53 seconds:
Короче не всё так однозначно. По ссылке же следующий пост сразу где эти фраза из ДШ уже по-другому звучит:
Т.е. уже чистый сброс/установке без всяких RMW.Цитата из ДШ мега48
Some of the Status Flags are cleared by writing a logical one to them. Note that, unlike most other AVRs, the CBI and SBI instructions will only operate on the specified bit, and can therefore be used on registers containing such Status Flags. The CBI and SBI instructions work with registers 0x00 to 0x1F only.
И такое поведение команд CBI и SBI свойственно для всех АВРок, начиная с тини13, то есть, все выпущенные за последние 3 года модели. Неужели некоторые уже 3 года не читали даташитов? А вера здесь не при чём.
И вот еще: https://www.avrfreaks.net/forum/sbicbi-readmodifywrite
В общем для "новых" (те, что после tiny13 были) AVR не актуально. Для старых тоже надо смотреть, как бы не ошибочная копипаста в ДШ.I believe that these are actually incorrect. In older AVRs the sbi/cbi opcodes did indeed affect other bits in the register and therefore one had to be careful not to use them in registers that contained interrupt flags. However, as the line I quoted above says, in newer AVRs these opcodes only affect the desired bit. Likely these are just copy-paste errors from older datasheets.
В древних AVR да, получается было когда-то CBI/SBI не прямой записью, а атомарным RMW получается по сути. Т.е. они атомарны (не могут прерываться), но при этом RMW. Соб-но и есть ответ на вопрос не связи RMW и атомарности (я кстати нигде это тождественными понятиями не записывал).
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Странно вообще, что речь пошла про SBI/CBI. VladislavS вбросил, и пошло-поехало.
А тут как речь про обычные переменные шла, которые как бы в РОН, как правило, если они локальные. А это ANDI/ORI, достаточно атомарные.
А тут как речь про обычные переменные шла, которые как бы в РОН, как правило, если они локальные. А это ANDI/ORI, достаточно атомарные.
Re: Вопросы по С/С++ (СИ)
WiseLord, ну как обычно, углубились. Интересно на самом деле получается. Я не знал, что где-то оно так работало и вопрос не так просто про CBI/SBI инструкции. ARV правильно написал сначала, признаю, что я сам уже с переводом напутал и действительно скрин из мануала выше имеет отношение к тому, что SBI/CBI на каких-то AVR могут выполняться как RMW. Но на новых AVR это уже не так. Тоже стоит учитывать такие различия.
Тут вот вопрос - актуально ли это для С. Знает ли компилятор на каких "подархитектурах" AVR SBI/CBI работает независимо с битом, а где как RMW.
Тут вот вопрос - актуально ли это для С. Знает ли компилятор на каких "подархитектурах" AVR SBI/CBI работает независимо с битом, а где как RMW.
-
eduard_upk
- Родился
- Сообщения: 1
- Зарегистрирован: Пн май 27, 2019 00:34:25
Re: Вопросы по С/С++ (СИ)
Подскажите, в чем дело.
Рабочая среда: Keil, участок кода:
VALUE_TICK_PER_CURRENT_PERIOD != TICK_PER_CURRENT_PERIOD;
SCHEDULE1 != (VALUE_TICK_PER_CURRENT_PERIOD + 1);
и т.д.
VALUE_TICK_PER_CURRENT_PERIOD == 40 вместо 200
TICK_PER_CURRENT_PERIOD == 200 как и должно быть
SCHEDULE1 == 40 вместо 201



Рабочая среда: Keil, участок кода:
Проблема:......
#define TICK_PER_CURRENT_PERIOD (200)
......
const uint8_t VALUE_TICK_PER_CURRENT_PERIOD = TICK_PER_CURRENT_PERIOD;
......
const uint8_t SCHEDULE1 = (VALUE_TICK_PER_CURRENT_PERIOD + 1);
VALUE_TICK_PER_CURRENT_PERIOD != TICK_PER_CURRENT_PERIOD;
SCHEDULE1 != (VALUE_TICK_PER_CURRENT_PERIOD + 1);
и т.д.
VALUE_TICK_PER_CURRENT_PERIOD == 40 вместо 200
TICK_PER_CURRENT_PERIOD == 200 как и должно быть
SCHEDULE1 == 40 вместо 201



- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
А если всё же запустить программу?
Добавлено after 5 minutes 17 seconds:
Вот вы говорите вбросил. Это разве вбросил? А тем временем GCC 10 теперь вот так умеет.

Мопед не мой, пример с офсайта.
Добавлено after 5 minutes 17 seconds:
Вот вы говорите вбросил. Это разве вбросил? А тем временем GCC 10 теперь вот так умеет.
Мопед не мой, пример с офсайта.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
а вот так умеет?VladislavS писал(а):А тем временем GCC 10 теперь вот так умеет
Код: Выделить всё
#define правда true
#define брехня false
typedef bool логическое;
логическое значение = брехня;Добавлено after 4 minutes 58 seconds:
сцуко, умеет! сам выяснил...
ну, теперь-то заживём!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Я не об этом. Они ведь серьёзно считают, что Пи это знаковая целая константа, равная 3. Спасибо хоть константа.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
В военное время Пи может достигать значения 4 и даже более, подумаешь...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
Потом будут думать откуда погрешности в расчетах...VladislavS писал(а):Они ведь серьёзно считают, что Пи это знаковая целая константа, равная 3.
Re: Вопросы по С/С++ (СИ)
Жесть! Я просто думал как нибудь скукожить подпрограммы для индикатора, они непомерно много места занимают, а тиня нерезиновая 
Разумеется. Индикатор по ходу только US-ASCII понимает. Ну еще что-то японокитайское, я увидел это, когда накосячил с передачей тетрад. Есть с кириллицей, но он новый.
добавил еще такое:
int strlegnt = MY_STRING_LEN
,ПростоНуб писал(а):Ну и кодировку учитывайте при кириллице. Если вдруг в utf-8 запишите, будет 13 байт соотв, по 2 байта на символ.
Разумеется. Индикатор по ходу только US-ASCII понимает. Ну еще что-то японокитайское, я увидел это, когда накосячил с передачей тетрад. Есть с кириллицей, но он новый.
спасибо большое, все заработало.ПростоНуб писал(а):
Shuspano,Код: Выделить всё
#define MY_STRING "строка" #define MY_STRING_LEN sizeof(MY_STRING) const __flash char lcd_data[] = MY_STRING;
добавил еще такое:
int strlegnt = MY_STRING_LEN
Re: Вопросы по С/С++ (СИ)
И зачем? Зачем под это тратить память, когда размер строки во флэше всё-равно неизменен всегда?int strlegnt = MY_STRING_LEN