22.04.2017, 23:21
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,483
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Организация памяти.
А теперь поставьте что-нибудь между { } и посмотрите. Этот код будет безжалостно выкинут, потому что while(1) всегда true.
А теперь напишите
volatile int c;
c = 1;
while(c) { }
, даже не помещая ничего между {}, и посмотрите. А потом уберите volatile и снова посмотрите.
На Си можно набыдлокодить так, что мама-не-горюй, никаким ассемблерам и не снилось. Одни указатели чего только стоят... И особенно это касается расширений стандартного Си - навороченные макросы, атрибуты.
|
|
|
|
22.04.2017, 23:58
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Организация памяти.
NewWriter, Я нихрена не понял... Между какими { }?
Если между этими:
PHP код:
|
while(1)
{
какой-то код
}
другой код, который выкидывается.
|
то он не выкидывается ни при каких оптимизациях - именно потому что 1 - всегда true. Иначе я бы заметил - у меня главный цикл так везде сделан.
Вот после него - выкидывается (только что смотрел), что с оптимизацией что без, и правильно выкидывается.
Вы ничего не путаете?
Ассемблер по сравнению с C даёт гораздо больше возможностей наделать ошибок. В том числе и трудноуловимых. Другое дело, что пишут на нём намного меньшее количество людей, а кто ещё пишет - тот хоть с какой-то квалификацией, иначе сложнее мигания трудно что-то написать. Потому и быдлокода практически не видать. Да и просто чтобы найти какую-нибудь программу написанную на асме для ARM - придётся потрудиться.
На асме кстати те-же указатели, но суровей - например учёт типов и их соответствия - только вручную. Си хотя бы ругнётся, что, например, передаётся указатель не того типа, что должен.
|
|
|
|
23.04.2017, 03:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Организация памяти.
Сообщение от NewWriter
|
А теперь поставьте что-нибудь между { } и посмотрите. Этот код будет безжалостно выкинут, потому что while(1) всегда true.
|
Это вы с while ( 0) {...} перепутали
|
|
|
|
23.04.2017, 04:30
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Организация памяти.
AR_Favorit, и, видимо, с циклической(необязательно) проверкой не volatile переменной, которая может неожиданно для компилятора измениться - например в прерывании или в другом потоке в случае RTOS. Это как раз очень предсказуемо. Меня больше беспокоит синхронизация в условиях изменения порядка исполнения компилятором и даже процессором. Как то не очень представляю куда, как, в каких случаях и какие барьеры нужно вставлять... чтобы точно не получить какой-нибудь редкий гейзенбаг. Хорошо ещё, что нет необходимости так писать - всё только из интереса.
|
|
|
|
23.04.2017, 06:21
|
|
Прописка
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Организация памяти.
Сообщение от H4LF
|
многие современные микроконтроллеры оптимизированы для C и писать под них на ассемблере как-то не очень удобно.
|
Все с точностью до наоборот. Чем больше архитектура оптимизирована под С, тем проще писать на ассемблере. Патамушта на ассемблере нужно соблюдать все те же соглашения и правила, что и на Си. Только вручную. И без избыточного кода, который склонен генерировать компилятор с полным сохранением возможности отладки.
|
|
|
|
23.04.2017, 06:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Организация памяти.
Сообщение от H4LF
|
Меня больше беспокоит синхронизация в условиях изменения порядка исполнения компилятором
|
то, что стоит до __schedule_barrier(), гарантированно будет выполнено раньше того, что стоит после него.
Там же ссылки на __force_stores() и __memory_changed() (тот же самый барьер плюс гарантированный апдейт в памяти измененных до этого момента переменных, в первом случае внешних для функции, в которой применено, во втором - как внешних, так и локальных).
Ну и невыкидываемый оптимизатором __nop(), который помимо собственно вставки NOP делает то же, что и __schedule_barrier().
Сообщение от H4LF
|
и даже процессором
|
А вот тут я не знаю. По идее, процессор, умеющий менять порядок выполнения, должен сам разруливать процесс так, чтоб не было косяков...
|
|
|
|
23.04.2017, 09:16
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,483
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Организация памяти.
Ничего я не перепутал... А while(0) выбрасывается и без оптимизации.
Пример с while - эт для примера того, что Си может делать то, что от него не ожидается, причем один и тот же код может работать по-разному, в отличие от ассемблера. Коль уж разговор о том, какие ошибки можно допустить на Си, которых нельзя сделать на ассемблере.
Тут не только с while проблема. Для не-volatile переменных вообще выброшены арифметические операции, если компилятор видит, что других операций с переменной нет. Может, пример с while был не слишком удачным, но я хотел показать, что ошибки на Си можно делать еще более разнообразные, чем на ассемблере.
Сообщение от H4LF
|
Другое дело, что пишут на нём намного меньшее количество людей, а кто ещё пишет - тот хоть с какой-то квалификацией, иначе сложнее мигания трудно что-то написать.
|
Ну я раньше на асме для пиков писал, и не только мигание светодиодами, но и с графическими дисплями. По большому счету, не шибко сложно, просто объем текста большой.
...PS.. О, все-таки нашел фотку - чистый ассемблер для пика, графика, текст, все навороты
Сообщение от H4LF
|
Да и просто чтобы найти какую-нибудь программу написанную на асме для ARM - придётся потрудиться.
|
Где-то попадались, чел че-то пытался писакать там. Но как понял, дальше включения таймеров и мигания свдиодами это не пошло. Да и смысл напрягаться то. Можно делать короткие ассемблерные вставки в Си.
Последний раз редактировалось NewWriter; 23.04.2017 в 11:16.
|
|
|
|
23.04.2017, 09:22
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Организация памяти.
Сообщение от my504
|
Чем больше архитектура оптимизирована под С, тем проще писать на ассемблере.
|
Марк, не гони! Твоя тяга к ассемблеру, из-за упоротой привязанности к ПИК24-33, здесь совсем ни при чём. Сейчас АСМ уже как дурной тон. Нафиг-нафиг!
|
|
|
|
23.04.2017, 09:28
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Организация памяти.
Сообщение от H4LF
|
Как то не очень представляю куда, как, в каких случаях и какие барьеры нужно вставлять... чтобы точно не получить какой-нибудь редкий гейзенбаг.
|
На сайте АРМа вроде же всё растолковано что для чего.
|
|
|
|
23.04.2017, 10:19
|
|
Прописка
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Организация памяти.
Сообщение от STM32F0
|
Марк, не гони! Твоя тяга к ассемблеру, из-за упоротой привязанности к ПИК24-33, здесь совсем ни при чём. Сейчас АСМ уже как дурной тон. Нафиг-нафиг!
|
Во первых, если я ничего не напутал, это ветка про ПИКи.
Во вторых, я отвечал на конкретную ЛОЖНУЮ сентенцию об усложнении применения АСМа при Си-ориентированной системе команд и архитектуре.
Ну и в третьих, каждый сам решает для себя по поводу целесообразности применения той или иной платформы, производителя и тулчейна. Упоротость в АРМ, причем конкретно СТМ, столь же смешна, как и любая другая упоротость...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:11.
|
|