Кто любит RISC в жизни, заходим, не стесняемся.
Вс сен 23, 2018 15:28:10
Продуктивность ярко видна по форумам: все форумы просто заполнены стонами пользователей всяких калокубов: "нашёл в нете это. прикостылил к себе, что-то понатыкал там и там - не работает!
( перетыкал по-другому - опять не работает!
(( спасите-помогите - куда ещё потыкать?? - неделю уже бьюсь, а никак не получается!
((".
И практически ни одного вопроса от тех, кто читает мануалы и разбирается сам без всяких либ.
Это очень показательно.
И сделать кое-как, по-быстрому не разбираясь - это значит - переделывать потом и ещё и ещё. И в результате потратить много больше времени, чем если прочитать доки и сделать сразу нормально. Так что если важно время и оно ценно - то никаких калокубов однозначно!
IMHO вы съезжаете с конкретного примера на разговоры за жизнь. У меня не было проблем с кубом. И изучение его исходников начинать програмирование с чтения RM желания не прибавило. За тех кого вы видели на форумах отвечать не могу, т.к. делюсь собственным опытом.
Вс сен 23, 2018 15:37:01
pvit, мы все здесь наблюдали ваше "не было проблем" вы кого сейчас лечите?
Вс сен 23, 2018 15:41:46
Посмотрел что там сейчас куб генерит:
Первым делом LATENCY:
- Код:
void SystemClock_Config(void)
{
LL_FLASH_SetLatency(LL_FLASH_LATENCY_1);
if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1)
{
Error_Handler();
}
....
внутри функции работа с регистром напрямую:
- Код:
__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency)
{
MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, Latency);
}
и т.д.
imho как пример на подсмотреть пойдет
Вс сен 23, 2018 16:53:57
- Код:
void SystemClock_Config(void)
{
LL_FLASH_SetLatency(LL_FLASH_LATENCY_1);
if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1)
{
Error_Handler();
}
....
Это пять! Они сами сомневаются что смогли изменить один регистр?
Вс сен 23, 2018 18:30:52
Конечно сомневаются. Потому что MODIFY_REG изменяет лишь один бит регистра.
Или Вы будете утверждать, что если написать var |= 0x01, то в результате в var будет именно 0x01?
*поправка - не один бит, а сколько задано маской. Так что, возможно, это и лишнее.
Вс сен 23, 2018 19:37:29
WiseLord, правильно что сомневаетесь , это начало на пути к просветлению.
Вс сен 23, 2018 20:03:05
если написать var |= 0x01, то в результате в var будет именно 0x01?
Едва ли товарищ выше, к примеру, умеет эндить и орить, так что |= ему ничего не скажет. А что-то типа var &= ~0xfffc его и вовсе в ступор введет. Причем объяснять ему, почему не var &= 0x0003, совершенно бесполезно.
Вс сен 23, 2018 20:13:01
philosoraptor, ты только что обгадился по полной и все из-за абсолютной невнимательности...
Вс сен 23, 2018 20:38:09
Есть стандартные файлы кода запуска. В файлах есть комменты обьясняющие че по чем зачем и почему. О чем базар?
Вс сен 23, 2018 21:10:25
philosoraptor писал(а):А что-то типа var &= ~0xfffc его и вовсе в ступор введет. Причем объяснять ему, почему не var &= 0x0003
Разве не одно и тоже?
Вс сен 23, 2018 21:19:36
Мурик писал(а):Разве не одно и тоже?
ну как бы для 32-битной платформы не одно...
Вс сен 23, 2018 21:27:29
Тип переменных нам неизвестен. Может он uint16_t.
Вс сен 23, 2018 21:36:51
Это пять! Они сами сомневаются что смогли изменить один регистр?
Это писали особо недоверчивые индусы. Сомневаться им приходится во всем, включая даже то, что регистры непосредственно после подачи питания находятся в их дефолтных состояниях.
Вот кусок стартапа, функции, которая вызывается до main():
- Код:
void SystemInit(void)
{
/* Reset the RCC clock configuration to the default reset state ----------*/
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001U;
HSION там уже в единице, но индусы считают, что лишний раз не повредит. Ну а там где один лишний раз, то и другой уже лишним точно не будет:
- Код:
void SystemClock_Config(void)
{
LL_FLASH_SetLatency(LL_FLASH_LATENCY_0);
if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_0)
{
Error_Handler();
}
LL_RCC_HSI_Enable();
/* Wait till HSI is ready */
while(LL_RCC_HSI_IsReady() != 1)
{
}
LL_RCC_HSI_SetCalibTrimming(16);
LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSI);
/* Wait till System clock is ready */
while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
{
}
Все вышеперечисленные действия инитят регистры в их дефолтовые значения, которые и до этого те же самые значения имели. И как можно видеть, LL_RCC_HSI_Enable() пытается взвести изначально взведенный бит HSION уже во второй раз.
Вс сен 23, 2018 21:54:49
Вообще, можно придумать ситуации когда прошивка стартует с недефолтными регистрами.
Вс сен 23, 2018 21:58:01
Например?
Вс сен 23, 2018 23:00:34
Например управление передается из бутлодера.
Вс сен 23, 2018 23:54:09
Если основная прошивка стартует с перекрученными черти как регистрами бутлоадером, то это плохой, негодный бутлоадер. Но даже в этом крайнем случае очень сложно объяснить необходимость устанавливать бит HSION дважды подряд.
Пн сен 24, 2018 05:41:49
Результат работы процедуры инициализации не должен зависеть от предсостояния. Ошибочное, кривое или сбойное оно было - код должен работать. Вот как-то так.
Пн сен 24, 2018 07:26:11
philosoraptor писал(а):А что-то типа var &= ~0xfffc его и вовсе в ступор введет. Причем объяснять ему, почему не var &= 0x0003
Разве не одно и тоже?
А вы попробуйте сделать и так и эдак, и проверьте результат.
Добавлено after 8 minutes 33 seconds:- Код:
RCC->CR |= (uint32_t)0x00000001U;
Вот же он, ярчайший пример быдлокодинга и незнания азов. Сферический в вакууме. Битмаски? Не, не слыхали. И ведь индусы искренне верят, что приведение типов и/или добавление магического U заставят компайлер считать нули перед единицей.
Пн сен 24, 2018 09:01:31
Результат работы процедуры инициализации не должен зависеть от предсостояния. Ошибочное, кривое или сбойное оно было - код должен работать. Вот как-то так.
Не, "как-то так" не пойдет. Фантазмы должны быть ошеломительными, чтобы пресекать всякие вопросы и оправдывать любую белиберду.
Типичный сценарий разработки всегда включает появление из неоткуда кривейшего и горбатейшего загрузчика неизвестных свойств, чью врожденную убогость блестяще исправляет гениальнейший код из под индусов. Ограниченной дееспособности пользователь куба, страдая когнитивными расстройствами всех видов, не в состоянии понять ни байта ни в чем и только неизвестный индийский гений обширно подстелил соломки во всех темных уголках автоматически генерируемого кода, чтобы несчастный не убился насмерть в первую же секунду.
Ага. Все так обычно и бывает.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.