Pull to refresh
2
Алексей Черемисинов@lolikandr

User

1
Subscribers
Send message

Советую искать способы писать на cmake компактно. Чем дальше пишу - тем больше интересного нахожу. Вот минимально обфусцированный пример из моей практики:

toolchain-arm-cortex-m4.cmake

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(BIN2HEX arm-none-eabi-objcopy -O ihex)
set(C_COMPILER_VERSION_MIN "9.2")
set(CMAKE_C_FLAGS "-mcpu=cortex-m4 -mthumb -nostartfiles -ffreestanding -fno-strict-aliasing -mno-unaligned-access -fno-pie -mfpu=vfp -mfloat-abi=hard")
set(CMAKE_FIND_ROOT_PATH /usr/lib/arm-none-eabi)
# adjust the default behavior of the FIND_XXX() commands:
# search programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# search headers and libraries in the target environment
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

CMakeLists.txt

cmake_minimum_required (VERSION 3.16)

project(app LANGUAGES C ASM)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)

set(OPTIMIZATION_FLAGS "-O2")
set(TARGET_EXE "app.elf")
set(HW_DIR "hw/STM32F4xx")

set(SOURCE_COMMON
	SRC/crc.c
	SRC/main.c
	SRC/debug.c
	SRC/spi.c
	SRC/timer.c
	SRC/adc.c
	SRC/dma.c
)

set(SOURCE_HW
	SRC/${HW_DIR}/vectors.c
	SRC/${HW_DIR}/api.c
)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall ${OPTIMIZATION_FLAGS}")

include_directories(SRC SRC/${HW_DIR})

add_executable(${TARGET_EXE} ${SOURCE_COMMON} ${SOURCE_HW})

add_custom_target(app.hex ALL
	COMMAND ${BIN2HEX} ${TARGET_EXE}
	DEPENDS ${TARGET_EXE}
)

build.bat

rmdir build_stm32 /s /q
md build_stm32
cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=..\toolchain-arm-cortex-m4.cmake -S . -B build_stm32
cmake --build build_stm32 -j 20

В случае винды - нужно отдельно прилагать усилия, чтобы все используемые программы и компилятор были добавлены в PATH. Поскольку это не всегда так на рабочем компе - в репозитории лежит set_path_template.bat. Каждый разработчик может его скопировать в свой set_path.bat и настроить свои пути, например так: SET PATH=c:\Program Files (x86)\GNU Tools Arm Embedded\9 2019-q4-major\bin;%PATH%. Файл set_path.bat добавлен в .gitignore.

И конечно же в корне репозитория обязателен readme.md, где написано, где всё скачать, как установить, настроить, запустить.

cmake генерирует проект в текущей папке или в указанной ключом -B. Можно сделать, например так:

cmake -S path/to/source -B /tmp/path/to/build   # сгенерировать скрипты сборки, по-умолчанию - Makefile
cmake --build /tmp/path/to/build   # собрать всё при помощи скриптов сборки

Существует ли утилита, которая в Си-коде автоматически делает ...

На ум приходит только makeheaders (в поиск забивать makeheaders fossil), но там подход совсем уж суровый - вам просто не нужно писать хеадеры, утилита сгенерит всё сама :)

Я как-то пытался отследить по исходникам линукс ядра, как данные перемещаются из драйвера uart в line discipline, tty, а затем в приложение. В итоге не вышло, весьма запутанно оказалось. Вот и подумал, неужели эта статья реально описывает терминал с нуля? Ан нет (

10 лет жили на svn, а затем перешли на git. Самое ужасное в svn - это делать merge двух веток. Даже если изменения не пересекаются по файлам - это всегда занимало много времени, ручной работы и после - выгребали ошибки. Сделать merge в git, если изменения в разных файлах - это очень просто, буквально секунды. Если изменения в одинаковых файлах - то всякое бывает, чаще всего быстро, но иногда и вручную приходится собирать.
В общем, в 2026 году никому не посоветую svn.

Вообще то медиану используют потому, что это более правдивый показатель при любом распределении. Если медианная зарплата - значит половина людей точно получает эту сумму, а то и больше. А средняя зарплата вообще непонятно что показывает - может 10% людей получают такую сумму, а может и 45%, никто не знает.
Конечно лучше бы приводили 90ый-процентиль, но и медиана - уже хорошо!

"У программистов есть понятие - погрузится в контекст.", Вы не поверите - у ИИ тоже! И пока что контекст маловат, пока что.

Делал переход с SVN на Git несколько лет назад. Пришлось сделать одновременную работу репозиториев - коммиты в SVN автоматически отправлялись в Git (только несколько активных веток) и наоборот. А потом по одному разработчику за раз объяснялось, как работать с git клиентом. И так до тех пор, пока все не пересели, за 2 года. Параллельно переделывались скрипты, которые использвали номер ревизии SVN на хеш-коммита Git.

Вижу 2 разных подхода:

  1. в статье из-за декларативности пользователь вынужден именовать каждый transition, но обработка входов пока не ясно как, наверное будет "как обычно", например if InputVoltage > 14

  2. в вашем случае пользователь вынужден именовать каждый event, но обработка transition не закфиксирована (можно присвоить любое состояние, какое захочется). Интересно, возможно ли совместить?

Если мы используем менеджер паролей - то у нас уже очень высокий уровень безопасности.

Менеджер паролей надо уметь готовить использовать, вот я помню как-то поставил галочку "не спрашивать пароль при открытии окна" и через пару месяцев забыл мастер пароль... Как я задолбался потом восстанавливать пароли на каждом используемом сервисе!

Тогда уж и stdout отправить в uart, что бы весь набор puts, printf и т.д. заработал.

Возможно ли передать исключительное право, но не передать исходные тексты ПО, в случае, если в договоре об этом ничего не написано? Как Заказчик позднее может воспользоваться правом изменить ПО, если у него нет исходных тектов?

Напомнило: «сократить рабочий день по крайней мере до 6, а потом и до 5 часов. Это необходимо для того, чтобы члены общества получили достаточно свободного времени, необходимого для получения всестороннего образования. Для этого нужно, далее, ввести общеобязательное политехническое обучение, необходимое для того, чтобы члены общества имели возможность свободно выбирать профессию и не быть прикованными на всю жизнь к одной какой-либо профессии. Для этого нужно, дальше, коренным образом улучшить жилищные условия и поднять реальную зарплату рабочих и служащих минимум вдвое, если не больше, как путем прямого повышения денежной зарплаты, так и, особенно, путем дальнейшего систематического снижения цен на предметы массового потребления»
@ Сталин И. В. Экономические проблемы социализма в СССР // Соч. М., 1997. Т. 16. С. 203.

Простая истина: когда какой-то элемент инфраструктуры или бизнес-сервис простаивает, то компания несёт потери.

Это вообще не связанные вещи. Производительность цепочки зависит от элемента с наименьшей производительностью, то есть от самого загруженного элемента, а не от самого простаивающего.

Бенчмарков не хватает, особенно в сравнении с аналогами.

Больше времени занимает найти схему, определить где первый пин, распаять swd переходник, подключить разъем и программатор. А уж мэйк там или гуи от вендора - в общем всё равно, главное чтобы в readme об этом написали.

К сожалению, реальные батареи 10 лет не работают.

/Зануда вкл

Что любопытно, исходный патч был в 10 строк и именно с ним Josh Poimboeuf получил улучшение на 2,6%, и именно он написал вот эти слова:
Barrior_nospec() в 64-битной функции copy_from_user() работает медленно. Вместо этого используйте pointer masking, чтобы заставить user pointer установить все единицы для недопустимого адреса. Kernel test robot сообщает об улучшении на 2,6% в тесте per_thread_ops

А Торвальдс переделал реализацию (сделав 21-строчный патч), использовав идею исходного патча, о чём честно написал в тексте коммита со ссылками на автора:
This is a variation on a patch originally by Josh Poimboeuf [2].

В общем опять кто-то покусал журналиста. Хорошо, что git очень строг в сохранении авторства и текста кода.

1
23 ...

Information

Rating
6,692-nd
Location
Севастополь, Республика Крым, Россия
Date of birth
Registered
Activity