从零玩转CanMV-K230(3)-Hello World

本文介绍了如何在K230开发板上使用C语言进行裸机开发,包括设置软件环境、编写和编译代码,以及针对小核和大核的测试和进阶编译方法。通过步骤详细指导了从基本流程到使用SCons构建工具的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本系列文章的整体介绍方式和K210系列文章一致,先介绍使用C语言进行裸机开发,完成这一部分的学习之后在介绍如何使用MicroPython进行开发,这样安排主要是考虑到学习的循序渐进,让大家对这颗芯片最底层有所了解后,在进行应用的开发。本章我们学习如何将一个简单的C程序放在开发板上运行,学习的目的是让大家了解C语言开发的基本流程。

一、软件环境

在完成了上一章节的学习后,我们使用基于C语言的开发环境
k230_sdk中提供了工具链,分别在如下路径。
大核rt-samrt工具链

k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu

小核linux工具链

k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0

在这里插入图片描述

二、代码编写、编译

在ubuntu上创建一个C文件hello.c并加入如下代码,
gedit hello.c

#include <stdio.h>
int main (void)
{
    printf("hello world\n");
    return 0;
}

将hello.c放到与k230_sdk同一级目录下
在这里插入图片描述
编译适用于小核linux的可执行程序

k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-gcc hello.c -o hello

编译适用于大核rt-smart的可执行程序

k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gcc -o hello.o -c -mcmodel=medany -march=rv64imafdcv -mabi=lp64d hello.c

k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gcc -o hello.elf -mcmodel=medany -march=rv64imafdcv -mabi=lp64d -T k230_sdk/src/big/mpp/userapps/sample/linker_scripts/riscv64/link.lds  -Lk230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib -Wl,--whole-archive -lrtthread -Wl,--no-whole-archive -n --static hello.o -Lk230_sdk/src/big/rt-smart/userapps/sdk/lib/risc-v/rv64 -Lk230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib/risc-v/rv64 -Wl,--start-group -lrtthread -Wl,--end-group

三、测试

将编译好的hello以及hello.elf拷贝到sd卡的vfat分区内(sd卡烧写完镜像后可以在pc端看到一个可用的盘符),或通过其他方式(参考sdk使用说明文档)将可执行程序拷贝到小核的/sharefs目录下。
开发板启动后,在小核端运行测试程序,小核启动后输入root进入控制台

Welcome to Buildroot
canaan login: root
[root@canaan ~ ]#cd /sharefs
[root@canaan /sharefs ]#./hello
hello world

在大核端运行测试程序,这里要注意,先使用‘q’退出应用模式,才能进行命令行操作

cd  sharefs
./hello.elf
hello world

四、大核编译进阶

大核如果用musl-gcc直接编译的话,编译参数是比较多的,对于初学者来说很不方便,也不太好理解,当前sdk中提供了两种用于编译大核程序的方式,分别是scons和Makefile,这里我们介绍scons的编译方式,Makefile的编译构建较为复杂,不是rt-smart官方提供的编译方式,感兴趣的读者可参考src/big/mpp/userapps/sample中的Makefile结构来编译。

到k230_sdk/src/big/rt-smart/userapps目录下创建一个文件夹,命名为hello

cd k230_sdk/src/big/rt-smart/userapps
mkdir hello
cd hello

创建以下三个文件

hello.c

SConscript

# RT-Thread building script for component

from building import *

cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd]

CPPDEFINES = [
    'HAVE_CCONFIG_H',
]
group = DefineGroup('hello', src, depend=[''], CPPPATH=CPPPATH, CPPDEFINES=CPPDEFINES)

Return('group')

SConstruct

import os
import sys

# add building.py path
sys.path = sys.path + [os.path.join('..','..','tools')]
from building import *

BuildApplication('hello', 'SConscript', usr_root = '../')

之后回到k230_sdk/src/big/rt-smart/目录,配置环境变量

canaan@develop:~/k230_sdk/src/big/rt-smart$ source smart-env.sh riscv64
Arch         => riscv64
CC           => gcc
PREFIX       => riscv64-unknown-linux-musl-
EXEC_PATH    => /home/canaan/k230_sdk/src/big/rt-smart/../../../toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin

进入k230_sdk/src/big/rt-smart/userapps目录,编译程序

canaan@develop:~/k230_sdk/src/big/rt-smart/userapps$ scons --directory=hello
scons: Entering directory `/home/canaan/k230_sdk/src/big/rt-smart/userapps/hello'
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build/hello
CC build/hello/hello.o
LINK hello.elf
/home/canaan/k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/../lib/gcc/riscv64-unknown-linux-musl/12.0.1/../../../../riscv64-unknown-linux-musl/bin/ld: warning: hello.elf has a LOAD segment with RWX permissions
scons: done building targets.

编译好的程序在hello文件夹下

canaan@develop:~/k230_sdk/src/big/rt-smart/userapps$ ls hello/
build  cconfig.h  hello.c  hello.elf  SConscript  SConstruct

之后即可将hello.elf拷贝到小核linux上,然后大核rt-smart通过/sharefs即可运行该程序


总结

通过本章的学习,我们了解了使用C开发程序放到开发板上运行的基本流程

### 关于 CANMV-K230 设备播放视频的方法 对于 CANMV-K230 来说,要实现视频播放功能涉及多个方面的工作,包括但不限于硬件初始化、解码库的选择以及具体的编程接口调用。 #### 硬件准备与环境设置 为了能够顺利地在 CANMV-K230 上运行视频播放程序,首先需要确保已经正确安装并设置了开发环境。这通常意味着完成了 MicroPython 镜像的烧录工作,并且验证了基本的 I/O 功能正常运作[^2]。 #### 软件框架选择 针对视频处理任务,推荐采用 Kendryte 提供的标准 SDK 进行开发。特别是当涉及到多媒体应用时,SDK 中包含了必要的驱动和支持函数来简化开发者的工作流程。通过配置 `smart-env.sh` 文件中的编译器路径和其他工具链参数,可以为后续的应用构建打下良好基础[^3]。 #### 实现视频播放的具体步骤 虽然官方文档并没有直接提供完整的视频播放实例代码,但是可以根据已有的资源推断出大致的操作流程: 1. **加载媒体文件**:将待播放的视频文件传输到板载存储介质上; 2. **初始化显示模块**:根据所选用的显示屏型号完成相应的初始化过程; 3. **集成第三方解码库**:考虑到 K230 的性能特点,可能需要引入外部优化过的音视频解码组件(如 FFmpeg 或者其他轻量级替代品),以便高效解析常见的流格式; 4. **编写控制逻辑**:利用 Python 或 C/C++ 编写应用程序脚本来管理整个回放周期内的各项活动,比如读取帧数据、同步音频轨道等。 5. **调试与测试**:最后一步是对整体解决方案进行全面的功能性和稳定性检验,及时修正发现的问题直至达到预期效果为止。 ```python import os from machine import Pin, SPI import lcd # 假设存在这样的LCD库用于屏幕输出 def play_video(file_path): """模拟视频播放""" try: with open(file_path,&#39;rb&#39;) as f: while True: frame_data = f.read(1024*64) # 模拟读取一桢的数据 if not frame_data: break process_frame(frame_data) print(&#39;Video playback completed.&#39;) except Exception as e: print(f&#39;Error during video playback: {e}&#39;) def process_frame(data): """处理每一帧图像数据""" pass # 此处应加入实际的画面渲染指令 if __name__ == &#39;__main__&#39;: spi = SPI(-1, baudrate=27000000, polarity=0, phase=0) display = lcd.LCD(spi, dc=Pin(9), cs=Pin(8)) file_name = &#39;/path/to/video/file.mp4&#39; play_video(file_name) ``` 上述伪代码仅作为概念性的指导而非可以直接执行的真实范例。具体实施细节会依赖于目标平台特性及个人需求而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶与花语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值