-
- Ещё вариант, без изысков :) lentjaj1(234 знак., 13.02.2012 16:49)
- Последнее присвоение ИАР даже переварил как-то, сгенерировав что-то чудовищное. Интересно будет проверить, работает-ли. - Andreas(13.02.2012 17:09)
- в codepad.org работает :) насколько чудовищное? в размерах? - lentjaj1(13.02.2012 17:18)
- Полстраницы странного ассемблера. - Andreas(13.02.2012 17:28)
- А вот так в ARM-е получается, всего одна операция :) lentjaj1(1412 знак., 13.02.2012 17:30 - 14.02.2012 09:15)
- короче, выбрось этот камень вместе с компилятором :) - lentjaj1(14.02.2012 09:19)
- есть масса мест, где высокая производительность не нужна - koyodza(14.02.2012 11:40)
- тогда зачем автором был поднят этот вопрос? lentjaj1(106 знак., 14.02.2012 11:45)
- ИМХО, вопрос поднят в рамках "преждевременной оптимизации" (той, что корень всех зол). Многие не понимают, что рабочий проект и неэффективный компилятор - вещи очень часто совместимые. - SciFi(14.02.2012 12:04)
- +1 - koyodza(14.02.2012 12:37)
- ИМХО, вопрос поднят в рамках "преждевременной оптимизации" (той, что корень всех зол). Многие не понимают, что рабочий проект и неэффективный компилятор - вещи очень часто совместимые. - SciFi(14.02.2012 12:04)
- тогда зачем автором был поднят этот вопрос? lentjaj1(106 знак., 14.02.2012 11:45)
- Да, да! Професиионалы программируют PIC. Эти ваши армы -- поделка финских студентов. - fk0(14.02.2012 10:30)
- ЕМНИП, это поделка китайского студента. nnARM -> - SciFi(14.02.2012 10:43, ссылка)
- есть масса мест, где высокая производительность не нужна - koyodza(14.02.2012 11:40)
- короче, выбрось этот камень вместе с компилятором :) - lentjaj1(14.02.2012 09:19)
- А вот так в ARM-е получается, всего одна операция :) lentjaj1(1412 знак., 13.02.2012 17:30 - 14.02.2012 09:15)
- Полстраницы странного ассемблера. - Andreas(13.02.2012 17:28)
- в codepad.org работает :) насколько чудовищное? в размерах? - lentjaj1(13.02.2012 17:18)
- Последнее присвоение ИАР даже переварил как-то, сгенерировав что-то чудовищное. Интересно будет проверить, работает-ли. - Andreas(13.02.2012 17:09)
- А какой смысл переменной prom? if(prom&0x800000)prom|=0xFF000000; - Vladimir Ljaschko(12.02.2012 15:55)
- Это я из 24битного АЦП считываю и размножаю знак на все число. Я лишнее погрыз для ясности. - Andreas(12.02.2012 16:06)
- int32_t prom; ...; prom <<= 8; prom >>= 8; - SciFi(12.02.2012 22:23)
- Аж на 100 байт короче сразу вышло. Но как-то очень странно смотрится. И ИАР не заменяет деление сдвигом. Сказали разделить - он и делит. В общем очень сырой компилятор, хотя и удобный и привычный. Andreas(96 знак., 13.02.2012 09:10)
- последняя операция должна быть не prom >>= 8, а prom /= (1L<<24) - koyodza(12.02.2012 22:32)
- Либо у Вас глюки, либо у меня. Я склоняюсь к тому, что у Вас :-) Кстати, проверил: яр сгенерил вполне достойный код. - SciFi(12.02.2012 22:43)
- да, у меня: надо prom /= (1L<<8). Ваш вариант вдвигает 0 слева, т.е. отрицательные числа будут обработаны неправильно - koyodza(13.02.2012 00:49)
- Мой вариант вдвигает знак слева. Обратите внимание на тип: int32_t. Update: да, стандарт C99 говорит "implementation-defined". Но ведь на яре работает, чего же боле? :-) SciFi(344 знак., 13.02.2012 10:18 - 10:26)
- Кстати да. Очень качественные грабли языка C опять же. Сдвиги вправо они эта, могут быть арифметическими (сохранется 7-й бит), а могут быть с нулём в старшем разряде. Компиляторозависимо. Поймал себя на мысли -- я сейчас отловил пару багов в своих fk0(18 знак., 13.02.2012 00:53)
- А ведь Ты ещё за 2000 не ответил!!! - T.Дocтoeвcкий(13.02.2012 03:36, ссылка)
- Это ты гонишь, но.., если кто-то говорит тебе про переносимый код, гони его в шею. - java(13.02.2012 03:04, )
- Нужно отучаться от ассемблерного мышления делить сдвигами -- легко облажаться. - fk0(13.02.2012 00:55)
- да. Нормальный компилятор сам вместо деления сдвиги подставит когда нужно. Насчёт сдвига вправо в разных местах информация немного различается koyodza(481 знак., 13.02.2012 10:07)
- В первом случае все верно - они описывают свой компилятор. По второй ссылке они противоречат стандарту, ибо стандарт ясно говорит: Сергей Борщ(732 знак., 13.02.2012 11:35)
- почему по второй противоречат? Всё в полном соответствии Вашей цитате - koyodza(13.02.2012 11:58)
- Потому что они пишут "В противном случае они заполняются копией знакового бита" не указывая конкретный компилятор, а в стандарте такого нет. - Сергей Борщ(13.02.2012 12:02 - 12:09)
- ну да, Вы правы, могут заполняться или не заполняться, implementation-defined - koyodza(13.02.2012 12:12)
- Потому что они пишут "В противном случае они заполняются копией знакового бита" не указывая конкретный компилятор, а в стандарте такого нет. - Сергей Борщ(13.02.2012 12:02 - 12:09)
- Очень понятно и очень печально. Получается, знаковые надежнее никогда не сдвигать вправо. - Andreas(13.02.2012 11:45)
- Вывод неправильный. Просто нужно защититься от неожиданности. Писал выше: assert_static((0x87654321L >> 8) == 0xFF876543L). - SciFi(13.02.2012 11:51)
- А что мешает препроцессору сдвигать константы одним способом, а компилятору переменные - другим? - Andreas(13.02.2012 11:59)
- Мешает стандарт. Препроцессор не выполняет арифметических действий - он делает лишь текстовые подстановки. Константные выражения считает компилятор. - Сергей Борщ(13.02.2012 12:07)
- К сведению, препроцессор ничего сдвигать не умеет. А компилятор должен одинаково сдвигать константы и не константы, иначе из него глюки попрут со всех сторон. - SciFi(13.02.2012 12:03)
- А что мешает препроцессору сдвигать константы одним способом, а компилятору переменные - другим? - Andreas(13.02.2012 11:59)
- Вывод неправильный. Просто нужно защититься от неожиданности. Писал выше: assert_static((0x87654321L >> 8) == 0xFF876543L). - SciFi(13.02.2012 11:51)
- почему по второй противоречат? Всё в полном соответствии Вашей цитате - koyodza(13.02.2012 11:58)
- В первом случае похоже имеется в виду, что у беззнакового числа знак всегда 0, т.е сдвиг вправо все-таки со знаком. Но всегда ли это так?? - Andreas(13.02.2012 10:14)
- Что-то у вас с логикой не так. Знак числа без знака? <уходит, качая головой> - SciFi(13.02.2012 10:47)
- с какой радости? У беззнакового числа старший бит может быть любым - koyodza(13.02.2012 10:43)
- В первом случае все верно - они описывают свой компилятор. По второй ссылке они противоречат стандарту, ибо стандарт ясно говорит: Сергей Борщ(732 знак., 13.02.2012 11:35)
- да. Нормальный компилятор сам вместо деления сдвиги подставит когда нужно. Насчёт сдвига вправо в разных местах информация немного различается koyodza(481 знак., 13.02.2012 10:07)
- да, у меня: надо prom /= (1L<<8). Ваш вариант вдвигает 0 слева, т.е. отрицательные числа будут обработаны неправильно - koyodza(13.02.2012 00:49)
- Либо у Вас глюки, либо у меня. Я склоняюсь к тому, что у Вас :-) Кстати, проверил: яр сгенерил вполне достойный код. - SciFi(12.02.2012 22:43)
- if((signed char)(prom>>16) < 0) prom |= 0xFF000000; - Vit(12.02.2012 21:18)
- int32_t prom; ...; prom <<= 8; prom >>= 8; - SciFi(12.02.2012 22:23)
- Это я из 24битного АЦП считываю и размножаю знак на все число. Я лишнее погрыз для ясности. - Andreas(12.02.2012 16:06)
- а в чём по-Вашему неоптимальность? Это же 8-битник, а Вы ему 32-битные операции подсунули - koyodza(12.02.2012 15:31)
- «Та нє»(тм) IAR/STM8 1.30 таки крепко недолизан. Вплоть до такого, что ++var; делает одной асмовой командой инкремента ячейки памяти а --var; — грузит в аккумулятор, декрементирует, выгружает. SFR = const; уже научился делать при помощи MOV =ReAl=(110 знак., 12.02.2012 18:52, )
- И на чем остановились в итоге? - Andreas(12.02.2012 19:20)
- Вместо проверки 1 бита в 1 байте, он грузит 4 байта и делает И с ним. Вместо простой загрузки 0xFF в старший байт - опять загрузка 4 байт и ИЛИ с ними. Другой компилятор это понял правильно, но уж очень он другой. - Andreas(12.02.2012 15:44)
- попробуй объявить union и работай с байтами, раз компилятор тебя не понимает. lentjaj1(179 знак., 12.02.2012 16:19 - 18:02)
- Ассемблеристы такие ассемблеристы... На endianness кладём болт. - fk0(12.02.2012 17:21)
- Это я уже с горя попробовал, работает нормально, но этож какой маразм, зависящий от реализации компилятора причем. А таких моментов предстоит много... В общем, похоже проще заложиться на более жирный проц, который аж на 5рублей дороже :) - Andreas(12.02.2012 16:34)
- Вот-вот, лучше арм: там компиляторов много хороших и разных. Тоже делал что-то для STM8, и осталось впечатление, что яр там немного схалтурил. - SciFi(12.02.2012 22:29)
- это будет работать в большинстве случаев. lentjaj1(115 знак., 12.02.2012 17:31)
- Это НЕ БУДЕТ работать даже на x51 с компилятором KEIL, например. Потому, что там ендианность чисел для разных типов разная. Не говоря уж о разных CPU. - fk0(12.02.2012 17:36)
- об этом пусть думает тот кто использует не Intel числа, тем более стандартом Си это не предусмотрено. lentjaj1(102 знак., 12.02.2012 17:44 - 17:48)
- Числа не разделяются на "интел" и "не интел". Стандартом не предусмотрено потому, что этот порядок байтов у всех разный. И поэтому незачем пытаться писать говнокод наступая на давно известные грабли. И НЕЗАЧЕМ УЧИТЬ ПИСАТЬ ГОВНОКОД. В стандарте fk0(482 знак., 12.02.2012 18:03)
- это уже из разряда религиозных предпочтений, а говнокод это использование макросов для прокрутки переменных (не констант). lentjaj1(88 знак., 12.02.2012 18:08)
- А можно ещё и так, платформонезависимый код. lentjaj1(233 знак., 12.02.2012 18:01)
- Числа не разделяются на "интел" и "не интел". Стандартом не предусмотрено потому, что этот порядок байтов у всех разный. И поэтому незачем пытаться писать говнокод наступая на давно известные грабли. И НЕЗАЧЕМ УЧИТЬ ПИСАТЬ ГОВНОКОД. В стандарте fk0(482 знак., 12.02.2012 18:03)
- об этом пусть думает тот кто использует не Intel числа, тем более стандартом Си это не предусмотрено. lentjaj1(102 знак., 12.02.2012 17:44 - 17:48)
- Это НЕ БУДЕТ работать даже на x51 с компилятором KEIL, например. Потому, что там ендианность чисел для разных типов разная. Не говоря уж о разных CPU. - fk0(12.02.2012 17:36)
- Не нужно изращений. Нужно бит проверить -- так и пиши if (my_u32_variable_name & 1<<N_BIT) do_something... - fk0(12.02.2012 15:53)
- Это одно и то же и компилятор одинаково воспринимает константу, как ее не запиши. - Andreas(12.02.2012 16:01)
- Ну если флаги расположить в "атомарных" переменных, то и проблем вроде не будет. Какой смысл группирования флагов в переменные больше? - Vladimir Ljaschko(12.02.2012 16:08)
- это больше для программиста, а не для компилятора. fk0 прав, лучше сразу стараться отучиться от говнокодирования. Но на генерируемый код в данном случае это влиять не должно - koyodza(12.02.2012 16:06)
- Практически всегда я так и пишу, здесь редкое исключение, биты лень считать было. - Andreas(12.02.2012 16:08)
- Это одно и то же и компилятор одинаково воспринимает константу, как ее не запиши. - Andreas(12.02.2012 16:01)
- а уровень оптимизации какой? - koyodza(12.02.2012 15:47)
- Максимальный. - Andreas(12.02.2012 15:49)
- ну не знаю. Может, просто не допилили ещё компилятор - koyodza(12.02.2012 15:51)
- Максимальный. - Andreas(12.02.2012 15:49)
- попробуй объявить union и работай с байтами, раз компилятор тебя не понимает. lentjaj1(179 знак., 12.02.2012 16:19 - 18:02)
- «Та нє»(тм) IAR/STM8 1.30 таки крепко недолизан. Вплоть до такого, что ++var; делает одной асмовой командой инкремента ячейки памяти а --var; — грузит в аккумулятор, декрементирует, выгружает. SFR = const; уже научился делать при помощи MOV =ReAl=(110 знак., 12.02.2012 18:52, )
- Не нашел больших проблем с ИАРом при портировании проекта с MSP430 на STM8 : с добавлением функциональности вместо 6,7К стало 8,6К . В ядре (соответственно в ассемблере) даже не разбирался. Vladimir Ljaschko(196 знак., 12.02.2012 15:28)
- А STVD с космиком удалось подружить? - Andreas(12.02.2012 15:47)
- Даже не пробовал, сразу на ИАРе. - Vladimir Ljaschko(12.02.2012 15:50)
- А STVD с космиком удалось подружить? - Andreas(12.02.2012 15:47)
- Выражение for (u08 i=0;i<24;i++)... -- не соответствует стандарту языка C, между прочим как бы. Декларировать переменные не только в начале блока позволяет C99 (но не C89), а так чтоб прямо внутри оператора -- это скорей к C++. И u08 не является fk0(27 знак., 12.02.2012 14:24)
- А тайпдеф применять то можно? typedef unsigned char uint8_t; .... typedef uint8_t u8; - Vladimir Ljaschko(12.02.2012 15:39)
- typedef char mychar; typedef int myint; typedef long mylong;... Но зачем??? fk0(12.02.2012 15:43 - 15:46)
- А мне нравится - просто короче. Эти буковки в имени переменной больше востребованы. - Vladimir Ljaschko(12.02.2012 15:47)
- Правило 13: Леонид Иванович(13.02.2012 12:37)
- Они там в этой MISRA совсем с ума сошли. Звучит как "язык программирования C не должен использоваться". :-/ - fk0(13.02.2012 22:10)
- Буковки востребованы в ассемблере, где нет понятия типа данных. Заставь дурака goto не использовать... - fk0(12.02.2012 15:50)
- Правило 13: Леонид Иванович(13.02.2012 12:37)
- А мне нравится - просто короче. Эти буковки в имени переменной больше востребованы. - Vladimir Ljaschko(12.02.2012 15:47)
- typedef char mychar; typedef int myint; typedef long mylong;... Но зачем??? fk0(12.02.2012 15:43 - 15:46)
- В руководстве мутно написано Andreas(341 знак., 12.02.2012 14:51)
- Практически никто кроме жалких поделок финских студентов никто эти жалкие поделки ISO/IEC не поддерживают. Профессионалы программируют на православном C им. Кернигана и Ритчи. А без прототипов -- как ты вообще хотел, как компилятор поймёт как fk0(448 знак., 12.02.2012 15:08)
- А как православные несколько циклов подряд делают? Каждый раз вводят i,j,k,l... или {u08 i;for(;;){}} - Andreas(13.02.2012 09:18)
- часто во вложенных внутренних циклах нужен доступ к переменным внешних циклов. Так что всё равно удобнее использовать разные переменные koyodza(108 знак., 13.02.2012 10:49)
- Вообще лучше i,j,k,l. Потому, что i более внутреннего цикла перекрывает более внешнюю i. И легко написать ошибочный код с обращением к внешней i. GCC на такое умеет предупреждение давать. Но если очень хочется, то в C89 можно же написать: fk0(158 знак., 13.02.2012 09:39)
- Все это можно соблюсти, но неудобно. Похоже осталась надежда только на Raisonance - может там C99. - Andreas(12.02.2012 15:17)
- Что неудобно? Есть over90000 строк кода написанного на C99? Не верю! - fk0(12.02.2012 15:28)
- А как православные несколько циклов подряд делают? Каждый раз вводят i,j,k,l... или {u08 i;for(;;){}} - Andreas(13.02.2012 09:18)
- Практически никто кроме жалких поделок финских студентов никто эти жалкие поделки ISO/IEC не поддерживают. Профессионалы программируют на православном C им. Кернигана и Ритчи. А без прототипов -- как ты вообще хотел, как компилятор поймёт как fk0(448 знак., 12.02.2012 15:08)
- C99 позволяет так декларировать - koyodza(12.02.2012 14:37)
- А тайпдеф применять то можно? typedef unsigned char uint8_t; .... typedef uint8_t u8; - Vladimir Ljaschko(12.02.2012 15:39)
- Ещё вариант, без изысков :) lentjaj1(234 знак., 13.02.2012 16:49)