Перейти к содержанию
    

ViKo

Модератор
  • Постов

    12 216
  • Зарегистрирован

Весь контент ViKo


  1. Может быть, и не только вам :) Себе, так уж точно. Книжка эта есть "в закромах". Просто бомба, а не книжка. (неуместное сравнение, извиняюсь!) Настоящая Библия! Жаль, что не про Cortex.
  2. имею програмку Artefact Dictionary, переводчик, словарь. А я только скопировал и вставил. Рекомендую всем. Удобнее программы пока не видел. Жаль, давно не обновляется.
  3. И все-же, я не уверен, что этот код 000116 ea4f71e0 ASR r1,r0,#31 00011a eb007111 ADD r1,r0,r1,LSR #28 00011e f3c11107 UBFX r1,r1,#4,#8 есть расширение знака при делении на 16. Может, все-таки, округление? upd. Всё, нашел! В книге "ARM System Developer’s Guide" имеется точный ответ. If your code uses addition, subtraction, and multiplication, then there is no performance difference between signed and unsigned operations. However, there is a difference when it comes to division. Consider the following short example that averages two integers: int average_v1(int a, int B ) { return (a+B )/2; } This compiles to average_v1 ADD r0,r0,r1 ; r0 = a + b ADD r0,r0,r0,LSR #31 ; if (r0<0) r0++ MOV r0,r0,ASR #1 ; r0 = r0>>1 MOV pc,r14 ; return r0 Notice that the compiler adds one to the sum before shifting by right if the sum is negative. In other words it replaces x/2 by the statement: (x<0) ? ((x+1)>>1): (x>>1) В-общем, при делении на положительную константу U лучше не игнорировать.
  4. Еще у Keil есть вот такая pdf-ка http://www.keil.com/download/docs/403.asp Сам думаю попробовать RL-ARM, но пока дальше мечты не продвинулся.
  5. Симулятор в MPLAB IDE. Зашили -> не работает -> в симулятор -> подредактировали программу -> скомпилировали -> зашили -> ...
  6. Понял. Осознал. Искуплю. :) Но, посмотрите - в последних двух случаях - достаточно добавить U только к одной константе. После этого выражение становится беззнаковым, так, что ли?
  7. ;;;222 volatile uint8_t s0, s1, s2, s3; ;;;223 volatile uint8_t m1 = ((s1 + s2) * 9 - s0 - s3) / 16; 000106 eb0c0006 ADD r0,r12,r6 00010a eb0000c0 ADD r0,r0,r0,LSL #3 00010e eba00007 SUB r0,r0,r7 000112 eba00006 SUB r0,r0,r6 000116 ea4f71e0 ASR r1,r0,#31 00011a eb007111 ADD r1,r0,r1,LSR #28 00011e f3c11107 UBFX r1,r1,#4,#8 ;;;224 volatile uint8_t m2 = ((s1 + s2) * 9 - s0 - s3) >> 4; 000122 f3c01007 UBFX r0,r0,#4,#8 ;;;222 volatile uint8_t s0, s1, s2, s3; ;;;223 volatile uint8_t m1 = ((s1 + s2) * 9U - s0 - s3) / 16U; 000106 eb0c0006 ADD r0,r12,r6 00010a eb0000c0 ADD r0,r0,r0,LSL #3 00010e eba00007 SUB r0,r0,r7 000112 eba00006 SUB r0,r0,r6 000116 ea4f1010 LSR r0,r0,#4 00011a b2c1 UXTB r1,r0 ;;;224 volatile uint8_t m2 = ((s1 + s2) * 9U - s0 - s3) >> 4U; 00011c b2c0 UXTB r0,r0 Вы правы... На эти U L я обычно "ложил с прибором". Да, видно, зря. Не пойму, 16 - оно ж и в Африке 16. Или нет? Еще варианты ;;;222 volatile uint8_t s0, s1, s2, s3; ;;;223 volatile uint8_t m1 = ((s1 + s2) * 9U - s0 - s3) / 16; 000106 eb0c0006 ADD r0,r12,r6 00010a eb0000c0 ADD r0,r0,r0,LSL #3 00010e eba00007 SUB r0,r0,r7 000112 eba00006 SUB r0,r0,r6 000116 ea4f1010 LSR r0,r0,#4 00011a b2c1 UXTB r1,r0 ;;;224 volatile uint8_t m2 = ((s1 + s2) * 9U - s0 - s3) >> 4; 00011c b2c0 UXTB r0,r0 ;;;222 volatile uint8_t s0, s1, s2, s3; ;;;223 volatile uint8_t m1 = ((s1 + s2) * 9 - s0 - s3) / 16U; 000106 eb0c0006 ADD r0,r12,r6 00010a eb0000c0 ADD r0,r0,r0,LSL #3 00010e eba00007 SUB r0,r0,r7 000112 eba00006 SUB r0,r0,r6 000116 f3c01107 UBFX r1,r0,#4,#8 ;;;224 volatile uint8_t m2 = ((s1 + s2) * 9 - s0 - s3) >> 4U; 00011a f3c01007 UBFX r0,r0,#4,#8 Да, приходит понимание, что 16 - это число со знаком, а 16U - без знака. Спасибо! Похоже, виновник найден.
  8. Для uint в Keil /16 не равно >>4

    Вот листинг, в котором видно, что поделить на 16 требует больше команд, чем сдвинуть на 4 разряда. Для чего это, числа ведь беззнаковые? ;;;222 uint8_t s0, s1, s2, s3; ;;;223 uint8_t m1 = ((s1 + s2) * 9 - s0 - s3) / 16; 000106 eb0c0006 ADD r0,r12,r6 00010a eb0000c0 ADD r0,r0,r0,LSL #3 00010e eba00007 SUB r0,r0,r7 000112 eba00006 SUB r0,r0,r6 000116 ea4f71e0 ASR r1,r0,#31 00011a eb007111 ADD r1,r0,r1,LSR #28 00011e f3c11107 UBFX r1,r1,#4,#8 ;;;224 uint8_t m2 = ((s1 + s2) * 9 - s0 - s3) >> 4; 000122 f3c01007 UBFX r0,r0,#4,#8 Округление, что ли?
  9. 1. assignment (Computer En-Ru) присваивание. 1. Операция изменения значения переменной, регистра, элемента массива, поля записи или другого элемента данных. 2. назначение. Приписывание устройству или другому ресурсу имени, по которому к нему могут обращаться программы. (multiple assignment). 2. assignment (Mueller En-Ru) n. 1) назначение; assignment to a position - назначение на должность 2) ассигнование 3) распределение; (пред)назначение 4) задание 5) командировка 6) юр. передача имущества или прав 7) документ о передаче имущества или прав 8) attr. assignment clause - условие передачи (имущества, прав) syn.: stint
  10. STM32 и его RCC

    Да чё там измеритель LC - китайский мультиметр показывает достаточно точно, чтобы отличить 22pF от 33pF, не говоря уже от 0.1uF.
  11. Раздираемый любопытством, задал поиск Sylver. Но ничего не нашел. Что бы это значило? Вычистили вместе с постами? :) Может, мне тоже пора к психиатру?
  12. STM32 и его RCC

    ПМСМ, земли мало. Полигоны предпочтительны. Или целые слои на многослойках.
  13. STM32 и его RCC

    Та плата, что вы показали, не разведена до конца. Например, земля. И другие цепи. Во всяком случае, так показывает P-CAD. Сначала с платой разберитесь.
  14. STM32 и его RCC

    Работает ли кварцевый генератор, вы можете увидеть осциллографом. Думаю, дело не в нем.
  15. Есть правила форума. В данном случае нарушен пункт 2.1.в. Я зашел, думал, у кого-то жизнь под угрозой. Вопросы с подобными заголовками можно просто игнорировать. Правильно поставленный вопрос - уже часть ответа. Хотя сам предмет вопроса в данном случае - нормальный.
  16. Для числа 14, т.е. 4'b1110, достаточно объединить 3 старших бита по И. Если выход равен 1, то все эти биты установлены, значит число есть 4'b1110 или 4'b1111. А это и есть >=14. А чтобы точно убедиться, что число точно равно 14, нужно проверять еще и младший бит на равенство 0, т.е. проинвертировать его и подать на ту же схему И, что и раньше. Теперь она должна быть 4-х-входовой.
  17. Про "халяву" в виде платы на kazus.ru наговорили много, а про "Харлей Дэвидсон" что-то никто и не мечтает :)
  18. Приму к сведению. У меня тоже было неплохо (еще свой простенький вариант субпиксельного сглаживания сделал): // 0x30 0 QUAD(01333000), QUAD(03001200), QUAD(12000300), QUAD(12000300), QUAD(12000300), QUAD(12000300), QUAD(03001200), QUAD(01333000), QUAD(00000000), QUAD(00000000), дефайнами я столько вариантов не закодировал бы, места б в файле не хватило :)
  19. В начальном сообщении не говорилось про симулятор. Не правы. Определить D == 0x80 - это значит, проверить все 8 битов, а D >= 0x80 - проверить только один, старший.
  20. :bb-offtopic: Понадобились энкодеры. Что выбрал, купить не смогли. Заказал по ELFA близкие к нужным. Получили. Те, что со щелчками - нормально. А без щелчков - тугие, как ... как не знаю что. А в каталоге усилия просто не было указано, это уже в опциях выбирается. То есть, если по каталогу выбирать - то только полное типовое обозначение чтобы было. P.S. не подскажете, как тугие энкодеры "усовершенствовать" - высверлить что-нибудь, выкинуть...?
  21. Можно проверять условие не Counter == 14, а Counter >= 14. Тогда проскочить его будет труднее. На тактовом сигнале могли быть палки из-за отражений, и счетчик считал бы лишний фронт.
  22. Первого знаю, свой, "родной" производитель. Наши берут. А я что-то опасался, думал, "забугорные" качественнее будут. За второго спасибо. Буду иметь в виду обоих.
  23. Подсмотрел когда-то здесь на сайте, и слегка изменил (а четверичный формат - добавил) /* Макро для использования двоичного формата чисел */ #define _BITSET(bits) \ ((uint16_t) (\ (bits % 010) | \ (bits / 010 % 010) << 1 | \ (bits / 0100 % 010) << 2 | \ (bits / 01000 % 010) << 3 | \ (bits / 010000 % 010) << 4 | \ (bits / 0100000 % 010) << 5 | \ (bits / 01000000 % 010) << 6 | \ (bits / 010000000 % 010) << 7 | \ (bits / 0100000000 % 010) << 8 | \ (bits / 01000000000 % 010) << 9 | \ (bits / 010000000000 % 010) << 10 | \ (bits / 0100000000000 % 010) << 11 | \ (bits / 01000000000000 % 010) << 12 | \ (bits / 010000000000000 % 010) << 13 | \ (bits / 0100000000000000 % 010) << 14 | \ (bits / 01000000000000000 % 010) << 15)) #define BIN(bits) _BITSET(0##bits) /* Макро для использования четверичного формата чисел */ #define _PAIRSET(digits) \ ((uint16_t) (\ (digits % 010) | \ (digits / 010 % 010) << 2 | \ (digits / 0100 % 010) << 4 | \ (digits / 01000 % 010) << 6 | \ (digits / 010000 % 010) << 8 | \ (digits / 0100000 % 010) << 10 | \ (digits / 01000000 % 010) << 12 | \ (digits / 010000000 % 010) << 14)) #define QUAD(digits) _PAIRSET(0##digits) Мне это понадобилось, когда свой шрифт создавал - очень удобно "рисовать" буквы.
×
×
  • Создать...