STM32 HAL: используем printf

В сгенерированный кубом код нужно добавить следующий кусок в main.c:

#include  <errno.h>
#include  <sys/unistd.h> // STDOUT_FILENO, STDERR_FILENO

int _write(int file, char *data, int len)
{
   if ((file != STDOUT_FILENO) && (file != STDERR_FILENO))
   {   
      errno = EBADF;
      return -1; 
   }   

   // arbitrary timeout 1000
   HAL_StatusTypeDef status =
      HAL_UART_Transmit(&huart1, (uint8_t*)data, len, 1000);

   // return # of bytes written - as best we can tell
   return (status == HAL_OK ? len : 0); 
}

Я добавляю после /* USER CODE BEGIN 4 */. UART должен быть предварительно настроен. Да, это блокирующий код, но пока что он меня устраивает.

Смертные машины

Об это книге узнал из трейлера фильма. Захотел было сходить посмотреть, но посмотрев ещё несколько трейлеров разочаровался и взялся за книгу. Она не слишком порадовала: вместо ожидаемого стимпанка вышла детская сказка, которая, однако, совсем не годится для детей, слишком много смертей вокруг. Рекомендовать не буду, однако отзывы на вторую книгу лучше, так что попробую её.

Заводная

Альтернативное будущее, климатическая катастрофа, потеря многих технологий и расцвет биоинженерии. В этом, новом для меня, сеттинге разворачивается борьба министерств природы и торговли Банкока за власть в городе. Интересный и динамичный детектив, рекомендую.

Шантарам

Потрясающая история жизни беглого австралийского заключенного в Бомбее. Здесь есть всё: любовь, дружба, предательство, убийства, наркотики, война, бедность, тюрьма, болезни и доброта, очень много доброты и улыбок местных жителей. Длинная, интересная и очень захватывающая книга, очень рекомендую.

Remmina: unable to connect

Внезапно Remmina перестала подключаться к терминальному серверу по RDP. Сообщение об ошибке было не очень-то внятным:

[16:05:37:017] [3681:4047] [INFO][com.freerdp.client.common.cmdline] - loading channelEx cliprdr
[16:05:37:017] [3681:4047] [INFO][com.freerdp.client.common.cmdline] - loading channelEx drdynvc
[16:05:38:527] [3681:4047] [ERROR][com.winpr.timezone] - Unable to get current timezone rule
[16:05:38:539] [3681:4047] [INFO][com.freerdp.core] - ERRINFO_LICENSE_HWID_DOESNT_MATCH_LICENSE (0x00000104):The Client Access License ([MS-RDPELE] section 1.1) stored by the client has been modified.
[16:05:38:539] [3681:4047] [ERROR][com.freerdp.core.transport] - transport_check_fds: transport->ReceiveCallback() - -1
 libfreerdp returned code is 00010104

Но при внимательном изучении становится понятно, что дело где-то в libfreerdp, а точнее — в изменении сохраненной лицензии. Решил проблему топорно:

mv .config/freerdp/ .config/freerdp-old

После установки соединения Remmina предложила принять новый сертифика и без проблем подключилась к рабочему столу.