游戏回忆录其一:《To The Moon(去月球)》
“通关《To The Moon》的那个下午是我人生中最美好的下午” ——某网易云用户 简评 游戏时长:4 小时 评分:无 亮点:音乐、剧情 这部游戏使用简单的画面、触动心灵的音乐讲述了一个感人至深的关于遗忘和孤独的故事——遗忘是残酷的,但孤独并不是结局。 我无法为这款游戏打出评分,这个游戏在我心目中的不同于任何一款其他游戏,它更像是一部用游戏作为载体的电影,或者说它...
“通关《To The Moon》的那个下午是我人生中最美好的下午” ——某网易云用户 简评 游戏时长:4 小时 评分:无 亮点:音乐、剧情 这部游戏使用简单的画面、触动心灵的音乐讲述了一个感人至深的关于遗忘和孤独的故事——遗忘是残酷的,但孤独并不是结局。 我无法为这款游戏打出评分,这个游戏在我心目中的不同于任何一款其他游戏,它更像是一部用游戏作为载体的电影,或者说它...
GitLab Runner GitLab 提供了 CI/CD 功能,类似于 Github Action 和 Gitea Action。 GitLab 和 Gitea 一样,也需要一个独立的执行器(runner)用于管理 CI/CD 过程,包括接收命令、创建容器等。 安装 我一般会选择手动安装的方式,详情见官方文档:https://docs.gitlab.cn/runner/insta...
概念 flash 的特性较为独特,有以下概念: sector(扇区):最小可擦除单元 block(块):固定数量的 sector 的组合,逻辑概念 page(页):单次写入和读取单元,一般小于 sector 大小,flash 可以按照字节写入,也可按 page 写入。 静态均衡 一般而言,应用数据会按其修改频率分为两类: 冷数据:很少被修改的数据 热数据:...
查看预处理后代码的工具 https://cppinsights.io/ template 的初衷 模板被设计之初的用法是用于实现泛型。在加入模板之前,常常使用宏来实现泛型: #define add(T) _ADD_IMPL_##T #define ADD_IMPL(T) \ T _ADD_IMPL_##T (T a, T b) { \ return a + b; \ } ...
问题 在内存受限条件下,我们希望将一些常量对象放在 text 或 rodata 这种只读段中,而不是 data 或 bss 段,再搭配 XIP 技术来节省内存空间。见一文看懂内存分段。 在 C 语言中实现该效果非常容易,只需将在声明全局变量时加上 const 修饰符,常见的编译器一般会将该变量放置在只读段中。 在 C++ 语言中,GCC 编译器的行为不同,对于声明为 const 的全局...
协程介绍 协程(coroutine)是计算机程序的一类组件,类似于线程,是一种用于处理协作式多任务的方式。 协程适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。 协作意味着由拥有控制权的任务决定什么时候交出控制权,且交给哪个任务,而不是由操作系统的调度内核决定。 和线程的区别 线程使用通用的多任务执行方式,其依赖于操作系统内核的实现并行...
前言 vscode 的 Git 和 GitLens 插件已经能完成大部分的工作,本文介绍只能在命令行下实现的常用操作 合并多条提交 合并最后 2 条记录: git rebase -i HEAD~2 打印如下: GNU nano 3.2 git-rebase-todo pick f9fb267 feat: 提交1 pick 88ede48 feat: 提交2 # 变基 86d...
概要 Linux 中有两种设置定时器的方法:内核接口和 Posix 接口。本文介绍 Posix 定时器的使用,内核接口参考Linux 内核学习笔记之定时器和时间管理。 配置定时器模式 线程模式 线程模式就是每次定时器触发时都开启一个线程执行任务,优点是使用比较方便,缺点就是每次都会创建一个线程,如果定时器触发比较频繁就会产生大量的线程,性能也会受影响。 #include <t...
概要 本文将介绍如何在 ARM 平台上移植 FreeRTOS,并创建一个线程用于 QP/C 中的 QV 内核运行,项目构建使用 CMake+GCC 环境。 FreeRTOS 移植 FreeRTOS 提供了多套移植,这里选用GCC/ARM_CM0。 主要需要修改的是FreeRTOSConfig.h配置文件,主要是把动态内存分配功能关闭了,使内存更加可控: /* * FreeRTOS...
本文将网络接口(network interface)简称为网口 还有文章可供参考:《LwIP应用开发实战指南》 no-sys 无系统示例 中断部分: // 以太网帧接收中断处理程序 void eth_mac_irq() { /* Service MAC IRQ here */ // 假设收到了eth_data_count长度的数据 // 从lwip内的内存池中分配空间来...