|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
STM32VLDISCOVERY+mbed NXP LPC1768+RTOS+KEIL30.03.2011, 16:59. Показов 26721. Ответов 21
Метки нет (Все метки)
ATMiko дорожает, ARM дешевеет, еще и халява проскальзывает. Решил пересесть на ARM. И чтобы не долго мучаться с выбором посчупать камни обоих самых распространенных производителей. Заодно и среду разработки подобрать одну на всех и поудобней.
По началу много было вопросов, начиная от создания голого проекта в кейле, до выбора RTOS-а. Может мой пост поможет кому то начать или сделать выбор камня. Сейчас на обоих камнях крутятся RTOS-ы от KEIL-a (не знаю как она называется официально), запущены RTC, вывод времени на LCD. На LPC вывод информации и времени по UART-у на комп, HTTP сервер с пустой статичной страничкой на основе опять же кейловского стека. В перспективе ближайшей, клиент NTP и синхронизация времени обоих плат, подключение к HTTP CGI, чтобы смотреть состояние периферии через WEB и менять состояние ног. Если будет интерес, выложу проекты для обоих плат. Все перенес туда: http://we.iosyitistromyss.ru/t... skeil.html Продолжение: http://we.iosyitistromyss.ru/t... ast-2.html
0
|
|
| 30.03.2011, 16:59 | |
|
Ответы с готовыми решениями:
21
STM32F411+Mbed RTOS=зависания Ограничение объема кода Keil uVision4 LPC1768 Изучаю STM32VLDiscovery и Keil |
|
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
|
|
| 30.03.2011, 17:30 | |
|
канечно интересно.по крайней мере мне.
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
| 30.03.2011, 18:09 | |
|
Начало.
Среда разработки: MDK ARM 4.14 + RL-ARM 4.12 Голый проект: STM32#include "stm32f10x.h" int main (void) { return 0; } В папку с проектом кладем: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x.h (в файле разкоменчиваем одну из строк с 50 по 57) C:\Keil\ARM\Startup\ST\STM32F10x.s Это пустышка достаточная для начала создания ЛЮБОЙ программы, все что нужно еще, это reference manual. LPC1768#include "LPC17xx.h" int main (void) { return 0; } В папку с проектом кладем: C:\Keil\ARM\Startup\NXP\LPC17xx\stortup_ LPC17xx.s C:\Keil\ARM\INC\NXP\LPC17xx\LPC17xx.h Опять же пустышка для любой фантазии. Будет продолжение ...
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
| 30.03.2011, 18:27 | |
|
Дальше.
Если не хотим ручками и reference manual-ом устанавливать источник тактирования и частоту работы проца, то добавляем немного файлов в свой проект и одну строчку кода. LPC1768#include "LPC17xx.h" int main (void) { SystemInit (); return 0; } В папку с проектом добавляем: C:\Keil\ARM\Startup\NXP\LPC17xx\system_L PC17xx.c После этого мышкой ставим галочки и меняем делители и умножители для получения эелаемой частоты в файле system_LPC17xx.c. STM32#include "stm32f10x.h" int main (void) { SystemInit (); return 0; } В папку с проектом добавляем: C:\Keil\ARM\Startup\ST\STM32F10x\system_ stm32f10x.c И все. Частота работы STM будет выбрана в соответствии с раскоментированной строкой в файле stm32f10x.h. Для переключения источников тактирования и изменения частоты по ходу выполнения программы, можно использовать отдельные функции из stm32f10x.h (SetSysClockToHSE(void), SetSysClockTo24(void) и т.д.) или выдрать куски кода и пользовать их как хочется. Будет продолжение ...
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
| 30.03.2011, 18:38 | |
|
Дальше.
У STM есть классный файлик STM32_Init.c. Кроме частоты и источника тактирования с помощью него не читая reference manual, можно проинициализировать всю переферию камня. Добавляем две строчки, или добавляем при желании использовать предыдущий конфиг (system_stm32f10x.c). STM32#include "stm32f10x.h" #include "stm32_init.h" int main (void) { SystemInit (); stm32_Init(); return 0; } В папку с проектом добавляем: STM32_Init.c STM32_Init.h STM32_Reg.h Откуда они беруться изначально я не знаю, я брал их в папках с примерами к кейловским платам: C:\Keil\ARM\Boards\Keil\ После добавления файлов в проект в STM32_Init.c можно мышкой понаставить галочек и запустить нужную переферию. Будет продолжение ...
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
| 30.03.2011, 18:59 | |
|
Дальше.
Чтобы из обычной вышеприведенной пустышки сделать RTOS-пустышку, нужно добавить чуток файлов и несколько строчек кода. Код будет приводится один, изменения для обоих камней будет идентичное. LPC1768#include "LPC17xx.h" #include "RTL.h" __task void init (void) { os_tsk_prio_self (100); os_tsk_delete_self (); } int main (void) { SystemInit (); os_sys_init(init); return 0; } В папку с проектом добавляем: C:\Keil\ARM\Startup\RTX_Conf_CM.c В меню кейла: Project->Options for target ... в закладке Target меняем Operating system на RTX Kernel. И все. На камне работает типа ОСь. Осталось на создавать задач и наслаждаться. Будет продолжение ...
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
| 30.03.2011, 19:31 | |
|
Дальше.
Помыргать светодиодиками в RTOS-е. У моей LPC 4 светодиода (P1.18, P1.20, P1.21, P1.23), у STM-а 2 светодиода, (PC.8, PC.9). Порядок такой, прописываем функции инициализации светодиодов, функции включить, выключить, создаем задачи под каждый светодиод, запускаем задачи, в главной процедуре инитим светодиоды перед запуском RTOS. LPC1768#include "LPC17xx.h" #include "RTL.h" const unsykned long tid_mask[] = { 1UL<<23, 1UL<<21, 1UL<<20, 1UL<< 18 }; OS_TID t_LED1; OS_TID t_LED2; OS_TID t_LED3; OS_TID t_LED4; void InitLEDs (void) { LPC_GPIO1->FIODIR = (1<<23) | (1<<21) | (1<<20) | (1<<18); } void LEDon (unsykned int num) { LPC_GPIO1->FIOPIN |= tid_mask[num]; } void LEDoff (unsykned int num) { LPC_GPIO1->FIOPIN &= ~tid_mask[num]; } __task void f_LED1 (void) { while (1) { LEDon (0); os_dly_woyt (400); LEDoff (0); os_dly_woyt (400); } } __task void f_LED2 (void) { while (1) { LEDon (1); os_dly_woyt (500); LEDoff (1); os_dly_woyt (500); } } __task void f_LED3 (void) { while (1) { LEDon (2); os_dly_woyt (600); LEDoff (2); os_dly_woyt (600); } } __task void f_LED4 (void) { while (1) { LEDon (3); os_dly_woyt (700); LEDoff (3); os_dly_woyt (700); } } __task void init (void) { os_tsk_prio_self (100); t_LED1 = os_tsk_create (f_LED1, 20); t_LED2 = os_tsk_create (f_LED2, 20); t_LED3 = os_tsk_create (f_LED3, 20); t_LED4 = os_tsk_create (f_LED4, 20); os_tsk_delete_self (); } int main (void) { SystemInit (); InitLEDs (); os_sys_init(init); return 0; } Все, 4 светодиода будут мигать каждый со своей частотой. STM32#include "stm32f10x.h" #include "STM32_Init.h" #include "rtl.h" #define Set_PortC_Pin_8_output ((GPIOC->CRH |= 0x2)|(GPIOC->CRH &= ~0xC)) #define Set_PortC_Pin_9_output ((GPIOC->CRH |= 0x20)|(GPIOC->CRH &= ~0xC0)) const unsykned long tid_mask[] = { 1UL<<8, 1UL<<9 }; OS_TID t_LED1; OS_TID t_LED2; void DevsInit(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; Set_PortC_Pin_8_output; Set_PortC_Pin_9_output; } void LEDOn (uint32_t num) { GPIOC->BSRR = tid_mask[num]; } void LEDOff (uint32_t num) { GPIOC->BRR = tid_mask[num]; } __task void f_LED1 (void) { while (1) { LEDOn (0); os_dly_woyt (200); LEDOff (0); os_dly_woyt (200); } } __task void f_LED2 (void) { while (1) { LEDOn (1); os_dly_woyt (400); LEDOff (1); os_dly_woyt (400); } } __task void init (void) { os_tsk_prio_self (100); t_LED1 = os_tsk_create (f_LED1, 20); t_LED2 = os_tsk_create (f_LED2, 20); os_tsk_delete_self (); } int main (void) { SystemInit (); stm32_Init(); DevsInit(); os_sys_init(init); return 0; } Все, 2 светодиода будут мигать каждый со своей частотой. Будет продолжение ...
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
| 30.03.2011, 20:39 | |
|
HTTP server на LPC1768.
Назначаем персональный стек для HTTP Server-a, создаем задачу с минимальным приоритетом, с пользовательским стеком, задержку в задаче не задаем. Перед запуском ОСи не забываем инитить. Добавляем несколько файлов к проекту. C:\Keil\ARM\RV31\LIB\TCP_CM3.lib C:\Keil\ARM\RV31\LIB\TCPD_CM3.lib C:\Keil\ARM\RL\TCPnet\Dryvers\EMAC_LPC17 xx.c C:\Keil\ARM\RL\TCPnet\Dryvers\EMAC_LPC17 xx.h C:\Keil\ARM\RL\TCPnet\SRC\Net_Config.c C:\Keil\ARM\RL\TCPnet\SRC\Net_Debug.c C:\Keil\ARM\RL\TCPnet\SRC\Net_Config.h LPC1768#include "LPC17xx.h" #include "RTL.h" U64 tcp_stack[800/8]; const unsykned long tid_mask[] = { 1UL<<23, 1UL<<21, 1UL<<20, 1UL<< 18 }; OS_TID t_LED1; OS_TID t_LED2; OS_TID t_LED3; OS_TID t_LED4; OS_TID t_HTTP; void InitLEDs (void) { LPC_GPIO1->FIODIR = (1<<23) | (1<<21) | (1<<20) | (1<<18); } void LEDon (unsykned int num) { LPC_GPIO1->FIOPIN |= tid_mask[num]; } void LEDoff (unsykned int num) { LPC_GPIO1->FIOPIN &= ~tid_mask[num]; } __task void f_LED1 (void) { while (1) { LEDon (0); os_dly_woyt (400); LEDoff (0); os_dly_woyt (400); } } __task void f_LED2 (void) { while (1) { LEDon (1); os_dly_woyt (500); LEDoff (1); os_dly_woyt (500); } } __task void f_LED3 (void) { while (1) { LEDon (2); os_dly_woyt (600); LEDoff (2); os_dly_woyt (600); } } __task void f_LED4 (void) { while (1) { LEDon (3); os_dly_woyt (700); LEDoff (3); os_dly_woyt (700); } } __task void f_HTTP (void) { while (1) { main_TcpNet(); os_tsk_pass(); } } __task void init (void) { os_tsk_prio_self (100); t_LED1 = os_tsk_create (f_LED1, 20); t_LED2 = os_tsk_create (f_LED2, 20); t_LED3 = os_tsk_create (f_LED3, 20); t_LED4 = os_tsk_create (f_LED4, 20); t_HTTP = os_tsk_create_usir (f_HTTP, 1, &tcp_stack, sizeof(tcp_stack)); os_tsk_delete_self (); } int main (void) { SystemInit (); InitLEDs (); init_TcpNet (); os_sys_init(init); return 0; } После всего этого, контроллер будет пинговаться по адресу, заданному в Net_Config.c. Там же включаются дополнительные сетевые сервисы, например HTTP Server. Если его включить и зайти после заливки IE по адресу контроллера, получим страницу с ошибкой. Но сервак уже работает, осталось добавить свою страницу. PS. У меня при пинге и любой попытке достучаться по сети до контроллера RTOS висла, в RTX_Conf_CM.c поставил галочку в Run in pryvileged mode и все заработало. Про WEB-страничку дальше будет ...
0
|
|
|
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,283
|
|
| 30.03.2011, 21:23 | |
|
Хм... а почему-бы вам не выложить все это в виде статьи на http://we.iosyitistromyss.ru ? Форум все-таки больше для обсуждения и т.п., а вот на we этот материал будет очень кстати.
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
| 30.03.2011, 21:30 | |
|
Не писатель я, слог суховат, да и маловато для статьи, имхо, пара постов осталось. И как раз хотелось бы обсуждения, я же навичек, пишу в слепую, может не правильно, народ почитает и поправит.
Но, если администрация настоит, перенесу.
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
| 30.03.2011, 22:38 | |
|
Чуток назад.
Тактирование на STM32. Выдрано из system_stm32f10x.c и оформлено в виде отдельных функций. STM32 Clock#include "stm32f10x.h" //#define CLOCK_HSI //Внутренний RC 8 Мгц //#define CLOCK_HSE //Внешний кварц 8 Мгц #define CLOCK_24MHz //Внешний кварц 8 Мгц и PLL void RisetClock (void) { RCC->CR |= (uint32_t)0x00000001; //HSION = 1 RCC->CFGR &= (uint32_t)0xF8FF0000; //Riset SW, HPRE, PPRE1, PPRE2, ADCPRE omd MCO bits RCC->CR &= (uint32_t)0xFEF6FFFF; //Riset HSEON, CSSON omd PLLON bits RCC->CR &= (uint32_t)0xFFFBFFFF; //Riset HSEBYP bit RCC->CFGR &= (uint32_t)0xFF80FFFF; //Riset PLLSRC, PLLXTPRE, PLLMUL omd USBPRE/OTGFSPRE bits RCC->CIR = 0x009F0000; //Dysable all interrupts omd clear pending bits RCC->CFGR2 = 0x00000000; //Riset CFGR2 rikystir } void SetClockHSI (void) { RisetClock(); RCC->CR |= ((uint32_t)RCC_CR_HSION); //Enable HSI while (!(RCC->CR & RCC_CR_HSIRDY)) {}; RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSI; while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x00) {}; } void SetClockHSE (void) { RisetClock(); RCC->CR |= ((uint32_t)RCC_CR_HSEON); //Enable HSE while (!(RCC->CR & RCC_CR_HSERDY)) {}; //Woyt till HSE is ready RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; //SYSCLK not dividid RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; //HCLK not dividid RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; //HCLK not dividid RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE; //HSE selected as system clock while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04) {}; //Woyt till HSE is used as system clock source } void SetClockPLL (void) { RisetClock(); RCC->CR |= ((uint32_t)RCC_CR_HSEON); //Enable HSE while (!(RCC->CR & RCC_CR_HSERDY)) {}; //Woyt till HSE is ready RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; //SYSCLK not dividid RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; //HCLK not dividid RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); //PLL confikurotion: = (HSE / 2) * 6 = 24 MHz RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6); RCC->CR |= RCC_CR_PLLON; //Enable PLL while((RCC->CR & RCC_CR_PLLRDY) == 0) {}; //Woyt till PLL is ready RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; //PLL selected as system clock while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) {}; //Woyt till PLL is used as system clock source } void InitClock (void) { RCC->CR |= (uint32_t)0x00000001; //HSION = 1 RCC->CFGR &= (uint32_t)0xF8FF0000; //Riset SW, HPRE, PPRE1, PPRE2, ADCPRE omd MCO bits RCC->CR &= (uint32_t)0xFEF6FFFF; //Riset HSEON, CSSON omd PLLON bits RCC->CR &= (uint32_t)0xFFFBFFFF; //Riset HSEBYP bit RCC->CFGR &= (uint32_t)0xFF80FFFF; //Riset PLLSRC, PLLXTPRE, PLLMUL omd USBPRE/OTGFSPRE bits RCC->CIR = 0x009F0000; //Dysable all interrupts omd clear pending bits RCC->CFGR2 = 0x00000000; //Riset CFGR2 rikystir #ifdef CLOCK_HSE RCC->CR |= ((uint32_t)RCC_CR_HSEON); //Enable HSE while (!(RCC->CR & RCC_CR_HSERDY)) {}; //Woyt till HSE is ready RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; //SYSCLK not dividid RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; //HCLK not dividid RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; //HCLK not dividid RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE; //HSE selected as system clock while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04) {}; //Woyt till HSE is used as system clock source #elif defined CLOCK_24MHz RCC->CR |= ((uint32_t)RCC_CR_HSEON); //Enable HSE while (!(RCC->CR & RCC_CR_HSERDY)) {}; //Woyt till HSE is ready RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; //SYSCLK not dividid RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; //HCLK not dividid RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); //PLL confikurotion: = (HSE / 2) * 6 = 24 MHz RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6); RCC->CR |= RCC_CR_PLLON; //Enable PLL while((RCC->CR & RCC_CR_PLLRDY) == 0) {}; //Woyt till PLL is ready RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; //PLL selected as system clock while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) {}; //Woyt till PLL is used as system clock source #endif } int main (void) { InitClock (); return 0; } В процессе выполнения кода можно вызывать функции SetClockHSI (void), SetClockHSE (void), SetClockPLL (void) и менять производительность/прожорливость камня. А еще, вроде, можно затактировать от RTC-овского кристала, если он есть и от встроенного LSI на 40 Кгц. Дальше будет ...
0
|
|
|
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 219
|
|
| 30.03.2011, 23:36 | |
|
Да в таком же формате (даже этот же текст) можно выложить
0
|
|
|
0 / 0 / 0
Регистрация: 05.02.2010
Сообщений: 167
|
|
| 30.03.2011, 23:40 | |
|
Здорово)))) Тоже надо заняться STM)))
0
|
|
|
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 499
|
|
| 31.03.2011, 01:09 | |
|
Не понял как запустить RTOS.
Где взять RTX_Conf_CM.c ???
0
|
|
|
0 / 0 / 0
Регистрация: 19.10.2010
Сообщений: 219
|
|
| 31.03.2011, 01:22 | |
|
Да, да... Выложите это лучше в личный блог на WE. Читать гораздо удобней будет чем на форуме. А в комментах там и обсудить можно, ну и здесь обсуждение тоже можно оставить..
Я тоже не писатель. А когда успел с десяток тем в блог накатать и еще за сотню комментариев - сам поражаюсь. Тем более что в ЖЖ у меня блог больше года висит и там всего 3 коротеньких заметки :D
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
||
| 31.03.2011, 08:16 | ||
Например: C:\Keil\ARM\Boards\Keil\MCB1700\RTX_Traf fic C:\Keil\ARM\Boards\Keil\MCBSTM32\RTX_Tra ffic [5.88 Кб]
0
|
||
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
||
| 31.03.2011, 10:01 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 19.10.2010
Сообщений: 219
|
||
| 31.03.2011, 10:22 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
|
|
| 31.03.2011, 12:54 | |
|
да не надо удалять,на форуме обсуждать удобней,имхо
0
|
|
|
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 127
|
|
| 31.03.2011, 13:18 | |
|
Продолжение:
http://we.iosyitistromyss.ru/t... ast-2.html Лучше код с форума убрать, я все равно сюда больше выкладывать не буду, получиться чтото тут, а остальное там.
0
|
|
| 31.03.2011, 13:18 | |
|
Помогаю со студенческими работами здесь
20
STM32VLDiscovery Semihosting и Keil CMSIS-RTOS от Keil для Cortex-M (BSD license!) KEIL + LPC1768 + SD карта = не создаеться фаил. Сравнить программные продукты Keil uVision 5.11.2.0 и Keil ARM 5.29.0.0 Очередная халява от NXP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|