24.09.2012, 22:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Ох, Yurkin2007, ну, зачем так спешить?
Сообщение от Yurkin2007
|
...старшие 4 бита регистра AWUTB зарезервированы, и по правилам хорошего тона туда не надо ничего писать....
|
Именно!!! Однако же, пишут товарисчи из СГС-Томсона: - AWU-›TBR &= (uint8_t)(~AWU_TBR_AWUTB); // ~AWU_TBR_AWUTB ≡ ~0x0F ≡ 0b11110000 !!!
Сообщение от Yurkin2007
|
При этом состояние зарезервированных старших битов не изменяется.
|
Не изменяется только потому, что их там нет! ![Очень смешно](images/smilies/icon_veryhappy.gif)
Если в следующей ревизии там что-то появится, этот код будет писать в это "что-то" сначала единицы, потом - нули.
Сообщение от Yurkin2007
|
То же самое и для регистра AWU_APR ...
|
Именно - то же самое ( с точностью до количества бит): - AWU-›APR &= (uint8_t)(~AWU_APR_APR); // ~AWU_APR_APR ≡ ~0x3F ≡ 0b11000000 !!!
А вот младшие биты, в которые второй строкой вписываются целевые значения, сначала обнуляются (я именно об этом писал, вообще-то) - большой в этом смысл?
В остальном - всё пишете верно.
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 24.09.2012 в 22:38.
|
|
|
|
25.09.2012, 00:19
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от tempora
|
этот код будет писать в это "что-то" сначала единицы, потом - нули.
|
Оператор &= не является просто оператором присвоения. Сначала с содержимым регистра AWU-›TBR и константой 0b11110000 производится побитовый AND, а затем результат помещается обратно в регистр. Очевидно, что в результате этого старшие 4 бита останутся без изменения, а младшие занулятся.
В следующей строке оператор |= сначала производит побитовое ИЛИ содержимого регистра сo значением Time Base в виде 0b0000xxxx. При этом опять же старшие биты не изменяются, а в младших устанавливаются единички в нужных местах. Результат засылается обратно в регистр.
Если в последующих версиях STM8S будут запользованы старшие биты регистра AWU-›TBR, то этот кусок программы будет корректно записывать Time Base для AWU.
Последний раз редактировалось Yurkin2007; 25.09.2012 в 00:28.
|
|
|
|
25.09.2012, 00:43
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FAQ по STM8
Когда особых требований к оптимизации кода нет, я голосую за читаемость. С этими библиотеками читаемость кода просто превосходная. Пробежал глазами и сразу понял, что и как работает. А ваши битовые преобразования в основном коде вам одному понятны. Да и не вспомните через неделю, чего там навертели.
|
|
|
|
25.09.2012, 00:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Yurkin2007
|
Оператор &=
|
Фу, чёрт, по инерции проскочил и не заметил, что оператор-то И, а не ИЛИ (я ж о других битах говорил исходно) - прошу пардону! Однако, вопрос, касавшийся действующих бит, а не отсуствующих (" нафига, перед записью четырех бит, их очищать?") остается без ответа - зачем сначала в биты пишутся нули, а затем правильное значение?:
Код:
|
void AWU_Init(AWU_Timebase_TypeDef AWU_TimeBase)
{
/* Set the TimeBase */
AWU-›TBR &= (uint8_t)(~AWU_TBR_AWUTB);
AWU-›TBR |= TBR_Array[(uint8_t)AWU_TimeBase];
/* Set the APR divider */
AWU-›APR &= (uint8_t)(~AWU_APR_APR);
AWU-›APR |= APR_Array[(uint8_t)AWU_TimeBase];
} |
Мне именно этот компот и не нравился, если только нет какой-то причины, о которой я пока ничего в документации не нашел.
Так вот - есть причина, или это перегибы индусов?
__________________
There's always more than one way to skin a cat.
|
|
|
|
25.09.2012, 00:56
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Easyrider83
|
А ваши битовые преобразования в основном коде вам одному понятны.
|
Дык, мы как раз и обсуждаем код из Ваших любимых библиотек. ![Очень смешно](images/smilies/icon_veryhappy.gif) Так сказать, содержимое библиотечных .с-файлов ...
|
|
|
|
25.09.2012, 01:01
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от tempora
|
зачем сначала в биты пишутся нули
|
Это самый простой и очевидный способ записать, например, число 0b00001101 в регистр, содержимое которого в текущий момент равно 10100001. В результате этих двух строк будем иметь 10101101.
А как можно по-другому? Можете привести пример?
|
|
|
|
25.09.2012, 01:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Easyrider83
|
я голосую за читаемость.
|
Я тоже, но дело в том, что эти две цели достижимы одновременно. Не всегда, но часто.
И в данном случае - без особого труда. Скажем, перестраховка от записи зарезервированных бит обычно делается очисткой их в записываемом значении, а не в регистре. Далее - вместо того, чтобы передавать в функцию не значение параметра, а индекс в массив, где хранятся все возможные его значения, проще всё же передавать именно сам параметр - и он, и индекс всё равно задефайнены "говорящим" именем, так что читаемость одинаковая, зато, не нужно тратить клоки на доставание из массива и байты на хранение всех (часто, не используемых) значений - вот сразу и код сократится, и читаемость, как минимум, не ухудшится (улучшиться может - строк-то меньше будет, как и манипуляций с индексом и массивом).
А с "не вспомнится через неделю" не соглашусь. Ну, что тут сложного-то? :
Код:
|
// Spi Control Register bit fields:
#define SPISCKby4 (0)
#define SPISCKby16 (1)
#define SPISCKby64 (2)
#define SPISCKby128 (3)
#define SPI_MODE0 (0‹‹_CPHA)
#define SPI_MODE1 (1‹‹_CPHA)
#define SPI_MODE2 (2‹‹_CPHA)
#define SPI_MODE3 (3‹‹_CPHA)
...
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = SPI_MASK|(SPI_MODE3)|(SPISCKby16); |
Имена функций, в таком случае, тоже можно забыть.
__________________
There's always more than one way to skin a cat.
|
|
|
|
25.09.2012, 01:21
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от tempora
|
перестраховка от записи зарезервированных бит обычно делается очисткой их в записываемом значении, а не в регистре.
|
Я понимаю Ваши затруднения.
Ну, хорошо, очистили записываемое значение, получили 0b0000xxxx.
А дальше что? Неужели AWU-›TBR = 0b0000xxxx ?
|
|
|
|
25.09.2012, 01:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Yurkin2007
|
Можете привести пример?
|
Разумеется:
Код:
|
void AWU_Init(AWU_Timebase_TypeDef AWU_TimeBase)
{
...
/* Set the TimeBase */
AWU-›TBR =
(
AWU-›TBR & ((uint8_t)(~AWU_TBR_AWUTB))
)
| TBR_Array[(uint8_t)AWU_TimeBase];
...
} |
Ненужной записи нулей здесь нет. И никаких затруднений.
__________________
There's always more than one way to skin a cat.
|
|
|
|
25.09.2012, 01:26
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: FAQ по STM8
Бьюсь об заклад - Вы меня разыгрываете ! ![Весело](images/smilies/icon_laugh.gif)
Не, правда, очень смешно !
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:28.
|
|