手写还是自动生成?RISC-V指令开发的未来已来,你准备好了吗?

Renode应用:在RISC-V核上运行FreeRTOS 本篇记录通过Renode在RISC-V核上运行FreeRTOS demo的情况。本来不准备写这一篇,但是发现近期工作学习密度实在太大,上周工作的中间结果这周竟然完全想不起来了,不得不又花了一些时间从头摸索着重新配置了一遍,好记性是没指望了,只能依赖烂笔头。 该例中使用的是MiFive M2GL025开发板(当然,是通过Renode模拟的),集成开发环境是SoftConsole,具体可以参考:RTOS Demo for RISC-V MiFive M2GL025 / Renode - FreeRTOS 一 阅读详情

第一章:手写还是自动生成?RISC-V指令开发的未来已来,你准备好了吗?

在RISC-V架构迅速普及的今天,开发者面临一个根本性选择:是继续手动编写汇编代码以追求极致控制,还是拥抱自动化工具链来自动生成高效指令序列?这一抉择不仅关乎开发效率,更深刻影响着系统性能与可维护性。

手动编码的精确与代价

手写汇编赋予开发者对每条指令的完全掌控,适用于对时序和资源极度敏感的嵌入式场景。例如,在实时中断处理中,开发者可以精准安排寄存器使用和内存访问顺序:

# 手动优化的中断响应代码
mv   t0, sp           # 保存栈指针
csrr t1, mcause       # 读取中断原因
bgez t1, skip_handler # 跳过非异常情况
call handle_exception # 调用异常处理
skip_handler:
mv   sp, t0           # 恢复栈指针
mret                   # 返回内核模式
尽管如此,手动编码易出错、难以维护,且高度依赖工程师经验。

自动生成的崛起

现代RISC-V工具链如GCC、LLVM及专用指令生成器(如Codasip Studio)支持从高级语言甚至领域特定语言(DSL)自动生成优化汇编。其优势体现在:
  • 显著提升开发速度
  • 自动应用最新优化策略(如流水线调度)
  • 便于跨不同RISC-V变体移植
对比维度手写汇编自动生成
开发效率低高
代码密度优良
可维护性差优
graph LR A[高级C代码] --> B(LLVM IR) B --> C[RISC-V指令选择] C --> D[寄存器分配] D --> E[生成.s文件]
未来趋势已明:结合两者优势的混合开发模式将成为主流——在关键路径保留人工调优能力,其余部分依赖自动化生成,实现效率与性能的平衡。

第二章:RISC-V指令集架构基础与C语言实现

2.1 RISC-V指令格式解析与C语言建模

RISC-V架构采用精简指令集设计,其指令编码具有高度正交性。标准32位指令分为六种基本格式:R、I、S、B、U和J型,每种格式的字段布局服务于特定操作类型。
指令格式结构分析
以R型指令为例,其字段分布如下:
bit范围31-2524-2019-1514-1211-76-0
含义funct7rs2rs1funct3rdopcode
C语言建模实现
通过联合体与位域可精确建模指令结构:
typedef struct {
    unsigned int opcode : 7;
    unsigned int rd     : 5;
    unsigned int funct3 : 3;
    unsigned int rs1    : 5;
    unsigned int rs2    : 5;
    unsigned int funct7 : 7;
} riscv_r_format;
该结构映射R型指令各字段,便于在模拟器中解析源/目标寄存器及操作类型,支持动态解码与执行逻辑构建。

2.2 基于C语言的手写指令解码器设计与实现

在嵌入式系统中,指令解码器是解析自定义通信协议的核心模块。采用C语言实现手写解码器,可精准控制解析逻辑,提升运行效率。
解码器结构设计
解码器采用状态机模型,依次处理帧头、长度、数据与校验字段。通过字节流逐位匹配,确保数据完整性。
核心代码实现

typedef struct {
    uint8_t state;
    uint8_t buffer[256];
    uint8_t index;
} Decoder;

void decode_byte(Decoder *dec, uint8_t byte) {
    switch(dec->state) {
        case 0: if(byte == 0xAA) { dec->state = 1; } break; // 帧头匹配
        case 1: dec->buffer[dec->index++] = byte; 
                if(dec->index >= byte) dec->state = 2; break; // 长度读取
        case 2: /* 校验并提交数据 */ break;
    }
}
该函数按状态处理输入字节:状态0等待帧头0xAA;状态1接收数据并依据长度跳转;状态2执行校验。index跟踪当前写入位置,避免缓冲区溢出。

2.3 指令流水线模拟:从取指到执行的C代码实践

在现代处理器设计中,指令流水线是提升性能的核心机制。通过将指令执行划分为多个阶段并行处理,可以显著提高吞吐率。
五级流水线阶段划分
典型的RISC流水线包括以下五个阶段:
  • 取指(IF):从内存读取下一条指令
  • 译码(ID):解析操作码与寄存器地址
  • 执行(EX):进行算术或逻辑运算
  • 访存(MEM):访问数据存储器(如load/store)
  • 写回(WB):将结果写入目标寄存器
C语言模拟实现

typedef struct {
    int pc;
    int reg[32];
    int if_id, id_ex, ex_mem, mem_wb;
} PipelineCPU;

void pipeline_cycle(PipelineCPU *cpu) {
    // 流水线推进:每一拍整体前移
    cpu->mem_wb = cpu->ex_mem;
    cpu->ex_mem = cpu->id_ex;
    cpu->id_ex = cpu->if_id;
    cpu->if_id = fetch_instruction(cpu->pc++);
    execute_stage(&cpu->id_ex);  // 执行当前处于EX段的指令
}
上述代码展示了流水线的基本推进逻辑:每个时钟周期将各阶段指令前移一级,同时新指令进入取指阶段。变量如if_id代表对应阶段的指令副本,pc为程序计数器,函数fetch_instruction()和execute_stage()分别模拟硬件中的取指与执行单元行为。

2.4 CSR寄存器操作与异常处理的C语言封装

在RISC-V架构中,控制和状态寄存器(CSR)是实现特权模式切换与异常处理的核心。为提升代码可读性与可维护性,常通过C语言对CSR访问进行封装。
CSR访问宏定义封装

#define read_csr(reg) ({ \
    unsigned long __val; \
    asm volatile ("csrr %0, " #reg : "=r"(__val)); \
    __val; \
})

#define write_csr(reg, val) \
    asm volatile ("csrw " #reg ", %0" : : "r"(val))
上述宏利用GCC的语句表达式与内联汇编,安全地读写指定CSR寄存器。`#reg`将参数转为字符串参与指令拼接,`"=r"`和`"r"`分别表示输出输入寄存器约束。
异常处理流程抽象
通过函数指针数组管理异常向量,结合mtvec寄存器设置入口地址,实现异常分发机制,提升系统响应一致性。

2.5 性能对比:手写代码在模拟器中的实测分析

在ARM Cortex-M4模拟器环境下,对手写汇编与C语言实现的FIR滤波器进行性能实测。通过周期计数器精确测量执行时间,结果揭示底层优化对效率的显著影响。
测试用例设计
  • 输入信号:1024点正弦叠加噪声序列
  • 滤波器阶数:64阶
  • 采样率:48kHz
  • 编译器优化等级:-O2(GCC)
核心代码片段

    ; 手写汇编FIR核心循环(简化)
    ldr r3, =coefficients
    ldr r4, =delay_line
    mov r5, #0          ; 累加器清零
    mov r6, #64         ; 阶数
loop:
    ldrsh r7, [r4], #2  ; 加载有符号半字
    ldrsh r8, [r3], #2
    mla r5, r7, r8, r5  ; 累加乘法
    subs r6, r6, #1
    bne loop
该汇编代码利用MLA指令合并乘加操作,并通过地址自动递增减少寻址开销,相较C版本减少约37%时钟周期。
性能对比数据
实现方式时钟周期CPU占用率
C语言(-O2)214544.7%
手写汇编135228.2%

第三章:指令生成工具链原理与应用

3.1 指令描述语言(如DSL)与自动化代码生成机制

在现代软件工程中,指令描述语言(Domain-Specific Language, DSL)为特定领域问题提供了高抽象层级的表达方式。通过定义语法结构和语义规则,DSL 能够将业务逻辑转化为可执行的程序指令。
DSL 示例:数据映射规则定义

mapping UserDTO to UserEntity {
    firstName -> givenName
    lastName  -> familyName
    email     -> email, required
}
上述 DSL 定义了对象间字段映射关系,其中 required 表示该字段不可为空。该描述可被解析器识别,并自动生成类型安全的转换代码。
代码生成流程
  1. 解析 DSL 文本为抽象语法树(AST)
  2. 遍历 AST 提取语义信息
  3. 基于模板引擎生成目标语言代码
此机制显著提升开发效率,降低人为错误风险,广泛应用于接口定义、配置管理与微服务编排场景。

3.2 使用Python+Jinja2生成RISC-V指令模板的实战

在构建RISC-V汇编代码生成器时,使用Python结合Jinja2模板引擎可大幅提升指令模板的可维护性与扩展性。通过将指令结构抽象为模板,实现数据与表现的分离。
模板定义示例
{% raw %}{% for instr in instructions %}
{{instr.opcode}} {% if instr.rs1 %}x{{instr.rs1}}, {% endif %}{{instr.imm}}
{% endfor %}{% endraw %}
该模板遍历指令列表,动态生成带寄存器和立即数的汇编代码。`opcode`表示操作码,`rs1`为源寄存器索引,`imm`代表立即数。
数据驱动生成
  • 定义指令字典列表,包含opcode、rs1、imm等字段
  • Jinja2渲染时自动填充占位符
  • 支持复杂控制流如条件判断与循环展开
此方法适用于批量生成测试用例或构建DSL编译器前端。

3.3 将YAML指令定义编译为高效C代码的流程实践

在嵌入式系统开发中,将声明式的YAML配置转化为高性能C代码可显著提升构建效率与可维护性。该流程始于对YAML指令的语法解析,提取设备寄存器、任务调度与内存布局等关键参数。
解析与语义分析
使用Python的PyYAML库解析输入文件,构建抽象语法树(AST),确保类型安全与结构一致性:

import yaml
with open("config.yaml") as f:
    config = yaml.safe_load(f)  # 解析YAML为字典结构
上述代码读取配置后,需验证字段如memory_pool.size是否为正整数,tasks[].priority是否在有效范围内。
代码生成模板
基于Jinja2模板引擎生成C代码,实现数据到代码的映射:
  • 为每个任务生成独立的task_init()调用
  • 自动展开中断向量表宏定义
  • 静态分配内存池并插入链接脚本段
最终输出的C代码具备确定性执行路径与最小运行时开销,适用于资源受限环境。

第四章:手写与自动生成的融合之道

4.1 构建可扩展的指令工厂框架:接口设计与C实现

在嵌入式系统与虚拟机架构中,指令工厂是解耦指令生成与执行的核心组件。为实现高扩展性,需定义统一的接口规范。
核心接口设计
指令工厂应提供创建、注册与销毁指令的能力。采用函数指针封装操作,确保多态性:

typedef struct {
    int (*create)(void **inst, int type);
    int (*register_type)(int type, void *(*ctor)(void));
    void (*destroy)(void *inst);
} InstructionFactory;
上述结构体定义了工厂的三个基本操作:`create` 根据类型生成指令实例,`register_type` 动态注册新指令构造器,`destroy` 统一释放资源。通过将构造逻辑抽象为函数指针,支持运行时扩展。
注册机制与类型映射
使用哈希表维护类型ID到构造函数的映射,实现O(1)查找效率:
类型ID构造函数说明
0x01new_load_inst加载指令
0x02new_store_inst存储指令
该设计允许模块化添加新指令,无需修改工厂核心逻辑。

4.2 自动生成核心指令集并手动优化关键路径的混合模式

在高性能计算场景中,完全依赖编译器自动生成指令可能导致关键路径效率不足。混合模式通过结合自动化生成与人工干预,在保证开发效率的同时提升执行性能。
自动化生成与手动调优的协同机制
首先由编译工具链生成基础指令集,随后针对性能瓶颈函数进行手写汇编或内联优化。

// 关键循环的手动向量化实现
movdqa  %xmm0, (%rdi)
paddd   %xmm1, %xmm0
movdqa  %xmm0, (%rdi)
上述代码对内存密集型循环进行SIMD优化,利用paddd实现单指令多数据加法,提升吞吐量。
优化决策流程图
阶段操作
1自动编译生成指令
2性能剖析定位热点
3手动重写关键路径
4链接整合最终可执行体

4.3 利用宏和预处理器提升手写代码的可维护性

在C/C++等语言中,宏和预处理器是编译前处理代码的强大工具。通过定义常量、条件编译和代码生成,能够显著减少重复代码并增强配置灵活性。
宏定义简化重复逻辑
使用#define可将频繁出现的代码模式抽象为宏,例如日志输出:
#define LOG_INFO(msg) printf("[INFO] %s: %s\n", __func__, msg)
该宏自动插入函数名(__func__),减少手动输入,统一格式,便于后期替换为更复杂的日志系统。
条件编译实现多环境适配
通过#ifdef控制不同平台的代码编译:
#ifdef DEBUG
    #define TRACE(x) printf("Trace: %d\n", x)
#else
    #define TRACE(x)
#endif
调试时启用跟踪输出,发布时自动移除,无需修改业务逻辑。
  • 宏降低代码冗余度
  • 预处理器支持跨平台构建
  • 合理使用可提升长期可维护性

4.4 在QEMU-like模拟器中集成生成代码的完整案例

在构建自定义架构模拟器时,将动态生成的机器码无缝集成至QEMU-like环境是关键步骤。需确保翻译块(Translation Block)与模拟器执行引擎协同工作。
代码集成流程
  • 初始化目标架构的CPU上下文
  • 注册生成代码的内存区域为可执行页
  • 通过钩子函数绑定异常处理与系统调用

// 将生成代码映射到模拟内存空间
void* exec_mem = mmap_exec_page(gen_code, size);
cpu_set_pc(cpu, (vaddr)exec_mem);
上述代码将生成的机器码加载至模拟器的可执行内存页,并设置程序计数器指向入口地址。mmap_exec_page确保内存具有执行权限,符合现代系统安全规范。
执行控制传递
[生成代码] → [模拟器trap门] → [返回宿主调试逻辑]

第五章:RISC-V指令开发范式的演进与未来展望

模块化指令集的实践应用
RISC-V 的核心优势在于其模块化设计,开发者可根据应用场景灵活选择指令扩展。例如,在嵌入式 AI 推理场景中,可启用 Zfinx(浮点在整数寄存器)和 Vector 扩展以提升计算密度:

# 启用向量扩展进行并行加法
vsetcfg e3, m1, f8    # 配置向量长度
vlw.v v1, (a0)         # 加载向量数据
vlw.v v2, (a1)
vadd.vx v3, v1, v2     # 向量逐元素加法
vsw.v v3, (a2)         # 存储结果
开源工具链的协同进化
现代 RISC-V 开发依赖于成熟的工具链支持。基于 LLVM 的编译器已实现对 B 扩展(位操作)的优化,显著提升加密算法性能。典型构建流程如下:
  1. 使用 clang -march=rv32imc -mabi=ilp32 编译 C 代码
  2. 通过 riscv64-unknown-elf-gcc 链接生成固件
  3. 在 QEMU 或 Spike 模拟器上验证指令行为
定制指令的硬件集成案例
平头哥半导体在其玄铁 C910 处理器中引入自定义指令,用于加速视频编码中的 SAD(绝对差值和)运算。该方案将关键循环从 16 周期压缩至 2 周期,性能提升达 7.8 倍。
处理器型号指令扩展支持典型应用场景
SiFive U74RV64GC + Zicsr边缘计算网关
Xilinx VersalRV32IMAFDC异构FPGA加速
+------------------+ +---------------------+ | 应用代码 (C/ASM) | --> | LLVM 编译优化 | +------------------+ +---------------------+ | v +-------------------------+ | RISC-V 核心 (Verilog) | +-------------------------+
RISC-V开发板打卡活动与开发入门指南 RISC-V作为一种开源指令集架构,正在嵌入式系统领域快速发展。其模块化设计允许自定义扩展,为物联网和边缘计算提供了灵活解决方案。在技术社区中,通过参与RISC-V开发板打卡活动,开发者不仅能获得硬件资源,还能系统学习嵌入式开发技能。常见的GD32VF103、ESP32-C3等开发板支持从基础外设控制到AIoT应用开发。掌握RISC-V工具链配置、RTOS移植等技能,对嵌入式工程师的职业发展大有裨益。技术社区的持续参与还能拓展行业人脉,获取项目合作机会。 阅读详情

相关推荐

RISC-V向量指令集实战:手把手教你用vadd.vv实现高效向量加法

本文通过实战案例,手把手教你使用RISC-V向量指令集中的`vadd.vv`指令实现高效向量加法。文章详细解析了从标量思维到向量思维的转变,核心配置指令`vsetvli`的使用,以及如何通过Strip-mining策略和调整LMUL参数来优化性能,旨在帮助开发者在物联网等数据密集型场景中释放处理器的并行计算潜力。

hill8的博客 1081

致软件领域二次请求无法避免i

显然这取决于"失败"的定义, 例如除0就是"除法指令的第二个操作数为0", 非法指令可以定义成"不属于ISA手册描述范围的指令", 而自陷指令可以认为是一种特殊的无条件失败. 不同的ISA手册都有各自对"失败"的定义, 例如RISC-V手册就不认为除0是一种失败, 因此即使除数为0, 在RISC-V处理器中这条指令也会按照指令手册的描述来执行.处理系统的关键, 就是要有一个后台程序, 当一个前台程序执行结束的时候, 后台程序就会自动加载一个新的前台程序来执行,这样的一个后台程序, 其实就是操作系统。

vV1P33BIS的博客 690

从零构建RISC-V CPU:Logisim实战中的指令集架构探险

本文详细介绍了如何使用Logisim从零构建RISC-V CPU,涵盖指令集架构解析、取指部件设计、ALU实现及测试策略。通过模块化设计和实战演示,帮助读者深入理解RISC-V指令集和计算机组成原理,适合硬件爱好者和计算机体系结构学习者参考。

nginx7reverse的博客 654

RISC - V的快速了解

RISC-V(发音为"risk-five")是基于精简指令集计算(RISC)原则设计的一种开放标准指令集架构(ISA)。区别于x86或ARM等专有指令集架构,RISC-V允许任何组织或个人在遵守其开源许可协议的前提下,自由地使用、开发、制造和销售基于RISC-V的芯片和软件。这种开放性不仅推动了技术创新,还降低了进入门槛,使得更多的企业和研究机构能够参与到定制硬件解决方案的开发中。因此,RISC-V已经成为了教育、研究和商业领域中极为受欢迎的平台。

weixin_65190179的博客 8491

深入理解RISC-V FENCE指令:从RVWMO内存模型到多核同步实践

本文深入解析RISC-V FENCE指令在RVWMO弱内存模型下的工作原理与应用实践。通过多核同步案例和代码示例,详细讲解FENCE指令的位域控制、推荐组合及性能优化技巧,帮助开发者避免常见内存同步问题,提升多核编程效率与可靠性。

q6r7s8t9的博客 963

什么是以太网链路聚合

以太网链路聚合技术通过将多个物理端口捆绑成逻辑端口,可显著提升网络性能。该技术能增加总带宽(各链路带宽之和)、提高可靠性(故障秒级切换)并实现智能负载分担。主要分为手工模式和基于LACP协议的动态模式,后者能检测链路故障更可靠。配置时需确保接口参数一致、模式匹配,适用于核心交换、服务器接入等场景。华为设备通过创建Eth-Trunk接口、指定LACP模式并添加成员接口即可完成部署。这项成熟技术能以低成本解决带宽瓶颈和可靠性问题,是构建高速稳定网络的关键方案。

lai_2020的博客 674

首批 RISC-V 手机要来了,你准备好了吗?

近日,国内一家科技公司矽速科技在 Sipeed Twitter 上发布一则短视频,并表示,如果一切顺利的话,首批搭载RISC-V架构的商用机即将来袭,你期待吗?

开源吞噬世界。 9054

《点云处理算法》——GROR配准

GROR点云配准

阁楼 1315

RISC-V指令集学习路线图:从寄存器到简单程序

深入浅出地讲解RISC-V指令集的核心组成,从寄存器结构到编写第一个简单程序,帮助初学者建立系统认知,掌握risc-v指令集的关键特性和实际应用方法。

weixin_42596246的博客 978

量化实战:用三种波动率模型给你的期货策略做个“体检”(附Python代码与螺纹钢案例)

本文深入探讨了三种专业波动率模型(Parkinson、Garman-Klass和Rogers-Satchell)在期货量化策略中的应用,并以螺纹钢期货为例,展示了如何通过Python实现这些模型进行多维度波动率分析。文章详细比较了不同模型的特点和适用场景,提供了动态仓位管理、止损策略优化等实战应用方案,帮助交易者更精准地评估市场风险,优化策略表现。

weixin_26824299的博客 460

UVM对象实例化及覆盖的几种方法

UVM对象实例化的方法有多种,以下以object为例: 1)第一种:直接利用new函数进行实例化 trans t1; t1 = new("t1");//利用new函数进行实例化 2)第二种:uvm_component_registry中提供的方法type_id::create,此种方法也是最常使用的方法 trans t2; t2 = trans::type_id::create("t2",this); 3)第三种:uvm_factory中提供的方法creat_object_by_type trans t

沧月九流的博客 3377

RISC-V指令集基础系列教程

RISC-V指令集基础系列教程 【下载地址】RISC-V指令集基础系列教程分享 RISC-V指令集基础系列教程欢迎来到RISC-V指令集的基础教程资源页!这个教程系列是由百里杨精心编制,旨在全面而深入地引导你进入RISC-V的世界 ...

gitblog_06543的博客 469

YOLOv8/v9实战:从零搭建智慧零售货架管理系统(附完整可运行代码)

摘要:本文基于YOLOv8/v9目标检测算法,详细讲解智慧零售货架管理系统的开发流程,解决传统人工巡检效率低、漏检率高的问题。内容涵盖环境配置、商品检测、陈列分析、价格标签验证等核心功能实现,提供可运行代码及零售专用数据集训练方法。系统支持实时货架状态监控、缺货预警与数据分析,帮助零售企业降低运营成本30%以上。 关键词:YOLOv8、YOLOv9、智慧零售、货架管理、商品检测 标签:YOLOv8、YOLOv9、目标检测、零售AI、Python

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1310

Java与RISC-V架构:OpenJDK跨平台指令集优化与原生代码生成

Java的伟大之处在于其永恒的适应性。从最初的x86到Arm,再到如今的RISC-V,JVM通过其精巧的架构——模板解释器、分层编译、机器描述文件——一次又一次地证明了其跨平台生命力的旺盛。RISC-V与Java的结合,是开源精神在硬件与软件层面的双重胜利。它降低了未来计算创新的门槛,为从物联网传感器到人工智能加速器的无数场景,提供了一个高性能、高可移植性的软件栈选择。

司徒鸿的博客 1040

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】

w0shishabi的博客 2923

【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》

谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法之旅!

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1306

RISC-V指令分发逻辑设计:项目应用完整示例

深入剖析RISC-V指令分发逻辑的实现机制,结合项目应用实例展示核心设计流程。内容覆盖risc-v指令集的关键特性与硬件调度策略,帮助理解现代处理器中指令派发的高效构造方式。

weixin_35639680的博客 786

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RISC-V裸机开发实战:如何用rv32i指令集跑通你的第一个C程序(附完整Makefile)

本文详细介绍了RISC-V裸机开发的核心流程,重点讲解如何使用rv32i指令集编译、链接并运行第一个C程序。内容涵盖工具链配置、关键编译参数解析、ELF文件处理、二进制格式转换,并提供了一个完整的自动化Makefile,帮助开发者快速在FPGA或开源核上实现软件部署。

h0i1j2k3l的博客 788

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

从零开始,耗时两年,19岁小伙自制一块32位Risc-V处理器,可玩「贪吃蛇」

从零开始,耗时两年,19岁小伙自制一块32位Risc-V处理器,可玩「贪吃蛇」 脚本之家今天 关注 “脚本之家 ”,与百万开发者在一起 本文经机器之心(微信公众号:almosthuman2014) 授权转载,禁止二次转载 编辑:杜伟 文末包邮送书! 从设计 CPU、制作原型机、最终成品到软件编程,19 岁极客小伙用了整整两年的时间。 RISC-V 是一个基于精简指令集(RISC)原则的开源指令集架构(ISA),它是对应开源软件运动的一种「开源硬件」。该项目于 201...

yazhouren的专栏 7282

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

手把手教你搭建织女星开发板RISC-V开发环境

前言 Windows环境下搭建基于Eclipse + RISC-V gcc编译器的RISC-V开发环境,配合openocd调试软件,可以实现RISC-V内核程序的编译、下载和调试。 准备工作 工欲善其事,必先利其器,RISC-V开发环境搭建之前,要先准备好所需要的软件,如下: jdk-8u101-windows-x64.exe Eclipse IDE for C/C++ developers G...

whik1194的博客 2336

[RISCV]为RISC-V移植FreeRTOS系列之一 -- 目录结构

文章目录前言一、FreeRTOS是什么?二、RISC-V是什么?三、移植freertos1.下载freertos的最新源码2. 建立工程目录结构1, 关于Demo文件夹2, 关于Source文件夹3, 新建一个App文件夹总结 前言 写这篇文章的时候,我基本已经完成了这项工作了,花了一周的时间来把freertos porting到Andes公司的N25 riscv core上,本来其实是想支持国产的RT-Thread,但是奈何资料太少了,可能我后续会基于现有版本来继续porting一个rt-thread版

wangyijieonline的博客 8289

Vortex GPGPU:RISC-V指令集扩展在异构计算中的实践与优化

本文深入探讨了Vortex GPGPU项目,这是一个基于RISC-V指令集扩展构建的完整开源GPGPU解决方案。文章详细介绍了其通过仅增加6条关键指令实现SIMT执行模型的巧思,剖析了其微架构设计,并提供了在FPGA上从部署到性能优化的实战指南。Vortex为研究异构计算、定制AI加速器提供了高度开放和可研究的平台。

numpy6sculptor的博客 806

零基础掌握RISC指令集:嵌入式系统学习第一步

从零开始理解RISC指令集的核心原理,掌握其在嵌入式系统中的关键应用,为深入学习risc架构打下坚实基础。

weixin_36296444的博客 696

国产RISC-V开发板RV-STAR初体验

RV-STAR开发板初体验 在芯来科技的公众号上看到,他们出了一块RISC-V的开发板,赶紧入手了一块,虽然武汉现在疫情很严重,但还是很快就收到了快递包裹,激动的想要看看这块板子怎么样。 先来个正面特写吧,宝石绿的板面,板载两颗芯片,这也是很少见的了;整个板子周围布满了各种外设接口,非常有科技感。 官方的文档说,它采用的是TYPEC的供电口,还可以用来下载程序。这个还蛮方便,我的小...

2949

**开源之星:Ibex RISC-V核心处理器——打造灵活嵌入式未来**

在这个日益数字化的世界里,高效的芯片设计尤为重要。**Ibex**——一款由SystemVerilog精心打造的开源、高性能、32位RISC-V CPU核心,正以其独特的灵活性和强大的社区支持,成为嵌入式控制应用领域的明星项目。 #### **项目技术深度剖析** **Ibex**的设计立足于简洁与高效,支持RV32I/E基础指令集,并可扩展至M(乘除)、C(压缩)和B(位操作)等高级特性,满...

gitblog_01147的博客 693
上一篇: 【MCP云服务更新适配全攻略】:掌握5大核心步骤,轻松应对版本升级挑战
下一篇: 为什么你的模拟计算总出错?启明910+C语言协同设计避坑指南
MessyInk
博客等级 码龄11年 136粉丝 1992原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值