1. 示例
Spresense SDK 使用NuttX的NSH shell功能以 Built-in
命令的形式实现和提供每个示例。
示例名 | 说明 |
---|---|
accel |
加速度传感器的样本 |
adc |
A/D 转换器示例 |
alarm |
这是一个报警示例 |
asmp |
ASMP 示例 |
audio_player |
音频播放器的示例 |
audio_recorder |
这是录音机的示例 |
audio_through |
音频路径 |
camera |
相机示例 |
colorsensor |
颜色传感器示例 |
geofence |
Geofence样本 |
gnss |
GPS 示例 |
gyro |
这是陀螺仪传感器的样本 |
hello |
基于C的helloworld示例 |
helloxx |
C++ 的helloworld示例 |
light |
这是照度传感器的样本 |
mag |
这是地磁传感器的样本 |
press |
这是气压传感器的样本 |
proximity |
接近传感器的样本 |
tilt |
倾斜传感器示例 |
watchdog |
看门狗计时器的示例 |
2. GPS(GNSS)示例应用程序
本章介绍了GPS(GNSS)示例应用程序的操作过程。
2.1. 编译和加载过程
导航到下载的 Spresense SDK 文件夹,并使用以下步骤进行编译:
-
进入目录
sdk
。cd spresense/sdk
-
配置Nuttx Kernel。
tools/config.py --kernel release
-
配置SDK。
现在,我们将编译一个名为gnss
的Example应用程序,并指定examples/gnss
。tools/config.py examples/gnss
了解有关配置的详细信息,请参考 配置 。 -
编译。
make buildkernel make
有关生成的详细信息,请参考 编译 。 如果一切顺利,将在
sdk
文件夹中创建一个名为nuttx.spk
的二进制映像。 -
与Hello示例一样,使用
tools/flash.sh
将编译的映像nuttx.spk
加载到 Spresense 中。tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
-
加载完成并自动重新启动。
2.2. GPS 操作检查
将此 nuttx.spk
加载到 Spresense 中以运行GPS程序。
与Hello示例一样,打开串行终端。
minicom -D /dev/ttyUSB0 -b 115200 -s
builtin,当运行名为 gnss
的应用时,
将显示日志。
当定位不出来时
No Positioning Data
显示启动时为0的时间。 如果位置很好,大约一分钟,显示格林威治标准时间。 大约三分钟后,定位应该能够工作。
如果定位正常
Hour:9, minute:13, sec:20, usec:559 LAT 35.25.6303 LNG 139.22.1986
可以执行此操作,并获取纬度和经度。
3. Audio Player 示例应用程序
本章介绍了Audio Player示例应用程序的操作过程。
3.1. 编译烧入过程
导航到下载的 Spresense SDK 文件夹,然后按照以下步骤编译:
-
进入
sdk
。cd spresense/sdk
-
配置NuttX Kernel。
tools/config.py --kernel release
-
配置SDK。
这次我们将编译一个名为audio_player
的示例应用程序,因此请指定examples / audio_player
。tools/config.py examples/audio_player
有关配置的详细信息,请参考配置 。 -
编译。
make buildkernel make
了解有关编译的详细信息,请参考 编译 。 如果一切顺利,将在
sdk
文件夹中创建一个名为nuttx.spk
的二进制映像。 -
与Hello示例一样,使用
tools/flash.sh
将生成的映像nuttx.spk
加载到 Spresense 中。tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
-
加载完成并自动重新启动。
-
对于Audio Player,需要加载DSP二进制文件才能执行解码操作。 DSP二进制文件的位置可以是SD卡或SPI-Flash,但是这里我们将从SD卡加载。
在应用程序代码(audio_player_main.cxx)中指定DSP二进制路径。 在audio_player_main.cxx中,它由DSPBIN_PATH指定。
#define DSPBIN_PATH "/mnt/sd0/BIN"
上面代码表示选择SD卡。
如果要用SPI-flash,请指定 /mnt/spif/BIN
。 如果指定null,它将是Config中设置的路径。当PC读取时,此
/mnt/sd0/BIN
将成为根目录下的BIN/
。
创建此目录,并将DSP放在所需的编解码器上。使用MP3解码
spresense/sdk/modules/audio/dsp/ 在MP3DEC
下选择。 -
将要同时播放的音乐文件写入SD卡。 在audio_player_main.cxx中,在AUDIOFILE_ROOTPATH中指定。
#define AUDIOFILE_ROOTPATH "/mnt/sd0/AUDIO"
因此,在PC上加载时,请将要播放的音频文件放在根目录下的
AUDIO/
下。 同时,音频文件也可以放在该子目录中。 -
在当前的Audio Player示例中,使用简单的PlayList执行播放。 从而,指定播放列表文件名和位置且播放这些音乐文件。 在
audio_player_main.cxx
中,通过PLAYLISTFILE_PATH
指定播放列表路径, 以及通过PLAY_LIST_NAME
制定播放列表名字。#define PLAYLISTFILE_PATH "/mnt/sd0/PLAYLIST" #define PLAY_LIST_NAME "TRACK_DB.CSV"
因此,在PC上加载时,根目录下的
PLAYLIST/
下,创建名为TRACK_DB.CSV
的文件。有关
TRACK_DB.CSV
的内容,请参考spresense/sdk/modules/audio/playlist/
下的README.txt
。
准备所有这些来播放音乐。
3.2. Audio Player 检查操作
将 nuttx.spk
加载到实际设备中时,Audio Player程序将运行。
与 Hello 示例一样,打开串行终端。
minicom -D /dev/ttyUSB0 -b 115200 -s
builtin 运行名为 player
的应用时,
将显示一个日志,并播放音频。
如果出现错误,请参考 关于音频子系统错误 。
4. Audio Recorder 示例应用程序
本章提供Audio Recorder示例应用程序的操作说明。
代码结构、数据流、API 引用等,请参考 Audio Recorder Functions 。 |
4.1. 生成和加载过程
导航到下载的 Spresense SDK 文件夹,然后按照以下步骤生成它:
-
进入
sdk
。cd spresense/sdk
-
配置 NuttX Kernel。
tools/config.py --kernel release
-
配置 SDK。
-
现在,将生成名为
audio_recorder
的Example应用程序,并指定examples/audio_recorder
。tools/config.py examples/audio_recorder
这个配置为audio_recorder设置。
如果必要,可以更改以下项目。请不要更改任何其它。[SDK audio] <= Y [Audio Recorder] <= Y [DSP imange mount path] <= /mnt/sd0/BIN (1)
1 将DSP二进制文件的默认位置设置为SD卡。SPI-flash路径为 /mnt/spif/BIN
。了解有关配置功能本身的详细信息,请参考 配置 。 -
如果要对要录制的音频执行自己的信号处理,请设置Preprocess。
AudioRecorder 允许用户对录制的音频执行自己的信号处理。
如果要执行此操作,则必须在配置菜单中启用[Use preprocess]
。打开配置菜单。
tools/cofig.py -m
检查
[Use preprocess]
。[Examples] [Audio recorder example] [Use preprocess] <= Y (1)
1 Preprocess处理 有关Preprocess的详细信息,请参阅SDK开发人员指南 Set preprocess 。
-
-
编译。
make buildkernel make
了解有关编译的详细信息,请参考 编译 。 如果所有步骤都成功,将在
sdk
文件夹中创建名为nuttx.spk
的二进制映像。 -
与Hello示例一样,使用
tools/flash.sh
将生成的映像nuttx.spk
加载到 Spresense 中。tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
-
加载完成并自动重新启动。
-
对于Audio Recorder,需要加载DSP二进制文件才能进行编码。 可以在SD卡或SPI-Flash之间选择DSP二进制文件的位置,但在这里,将了解如何从SD卡加载它。
DSP二进制路径规范由应用程序代码(audio_recorder_main.cxx)中的宏值设置。
在audio_recorder_main.cxx中,使用DSPBIN_PATH
设置,并根据需要更改应用程序代码。#define DSPBIN_PATH "/mnt/sd0/BIN"
在SD卡上的
BIN
目录中。当PC读取时,此
/mnt/sd0/BIN
将成为根目录下的BIN/
。
创建此目录,并将 DSP 放在所需的编解码器上。如果要SPI-flash,请指定 /mnt/spif/BIN
。 此外,如果指定null,则路径将在Config中设置。使用MP3进行编码
spresense/sdk/modules/audio/dsp/ 下,选择MP3ENC
。
其他编码的Codec类型和DSP二进制的组合如下表所示。Codec DSP二进制 MP3
MP3ENC
LPCM
SRC
此外,如果设置了 Preprocess 处理,则以下Preprocess二进制文件也放在SD卡上。
二进制是PREPROC
,存于spresense/examples/audio_recorder/worker/src。在此示例应用程序中, PREPROC
默认包含一个简单的 RCfilter。
如果要自定义,如自己的信号处理,请参考 此处 。 -
录制的声音将记录在SD卡上。 录制路径也由应用程序代码(audio_recorder_main.cxx)中的宏值设置。 在audio_recorder_main.cxx中,使用
RECFILE_ROOTPATH
设置它,因此根据需要更改应用程序代码。 示例一样,打开串行终端。#define RECFILE_ROOTPATH "/mnt/sd0/REC"
记录在SD卡上。
4.2. Audio Recorder 检查操作
将 nuttx.spk
加载到实际设备中时,将运行音频记录程序。
与 Hello示例一样,打开串行终端。
minicom -D /dev/ttyUSB0 -b 115200 -s
builtin,当运行名为 recorder
的应用时,
将显示声音。
录制的音频可以在PC上播放。在这种情况下,音频文件位于SD卡根目录下的 REC/
。
如果出现错误,请参考 关于音频子系统错误 。
4.3. 关于DSP二进制(PREPROC)自定义
描述如何自定义DSP二进制文件(PREPROC)。
4.3.1. Step1. PREPROC 代码编辑
了解 PREPROC 的代码配置和编辑位置。
代码分为两部分:开发者编译指引 以及作为框架提供的部分。
4.3.1.1. 用户编辑的代码
开发者应主要编辑的代码。
可以编辑这些代码以在 DSP 中编写信号处理。
DSP代码位于 woker
目录中,其中有一个 userproc
目录。
如果仅在 userproc
目录中写入信号处理等,而不需要更改任何其他信息。
main.cpp
包含与启动过程~MainCPU 的数据通信控制,因此不要更改它。
包括启动和DSP通信处理。无需编辑。
定义与DSP通信命令的标头文件。
此文件包含所需的参数。
用户代码的标头文件。
用户代码正文。
写入或调用此文件,如信号处理。
4.3.1.2. 用户代码提供的接口
userproc.cpp 提供 Init
、 Exec
、 Flush
和 Set
命令框架。
用户代码可以通过编写相应的内容来实现DSP中的处理。
描述用户应执行的操作。
(默认情况下,RC 筛选器作为示例内置。)
通过命令在DSP内部进行状态转换,如下图所示。
使用每个命令按以下方式处理。
-
当调用 AUDCMD_INIT_MICFRONTEND 时,DSP将启动。
-
设置
Init
命令所需的参数,如ch数和位长度。 -
开始录制时,捕获的语音数据会定期发送到DSP与
Exec
命令,因此请执行所需的筛选。 -
如果要随时更改DSP中的参数等,则希望通过发送
Set
命令来实现它。 此命令的执行时间按接收顺序显示,包括Exec
。 -
如果停止录制,则最后一个语音数据
Exec
后跟Flush
命令,因此,如果需要终止,请在此处执行此操作。
定义命令
每个功能使用的数据类型都写入 userproc_command.h
,可以自由重写其内容。
每个命令的格式如下图所示。
顶部白色部分具有固定所需的最小参数。请不要更改。
开发者在 userproc_command.h
中定义的参数是下图中的 User param
(粉红色部分)。
描述每个命令。
struct InitParam : public CustomprocCommand::CmdBase
-
用于Init处理的参数。
默认情况下,所有内容都保留,但应更改为所需的参数,如ch数和位长度。
struct ExecParam : public CustomprocCommand::CmdBase
-
Exec处理的参数。
语音数据的地址大小在继承的CustomprocCommand::ExecParamBase
中定义,如上图中的ExecParam
中那样。
详细信息,请参考/sdk/modules/include/audio/dsp_framework/customproc_command_base.h
。
struct FlushParam : public CustomprocCommand::CmdBase
-
这是Flush处理的参数。
语音数据的地址大小定义为继承自有的CustomprocCommand::FlushParamBase
,如上图中的ExecParam
中那样。
详细信息,请参考/sdk/modules/include/audio/dsp_framework/customproc_command_base.h
。
struct SetParam : public CustomprocCommand::CmdBase
-
用于Set处理的参数。
定义要动态更改的各种参数。定义默认RC滤波器的On/Off和系数。
功能函数
以下函数组在 userproc.cpp
中编写。 内容可以自由重写。
根据每个操作 命令定义 。
void UserProc::init(InitParam *)
-
按照 InitParam ,编写初始化过程。
使用应用程序代码中的 AUDCMD_INIT_PREPROCESS_DSP 命令运行。
(默认情况下,不工作。)
void UserProc::exec(ExecParam *)
-
然后按照 ExecParam,处理信号。
开始录制时定期从SDK内部调用。
1帧是768个样本,用于LPCM的录制设置,1152(但在16kHz时为1728),用于MP3。
(默认情况下,写入了 RC 筛选。)
void UserProc::flush(FlushParam *)
-
按照 FlushParam ,编写Flush(终止)功能。
停止录制时仅从SDK内部调用一次。
如果延迟(如IIR或FIR滤波器)发生,请在最终帧后执行flush
以输出延迟。
如果要输出任何数据,请写入输出数据地址。
(默认情况下,不工作。)
void UserProc::set(SetParam *)
-
按照 SetParam 编写设置功能。
使用应用程序代码中的 AUDCMD_SET_PREPROCESS_DSP 命令运行。
(默认情况下,设置RC滤波器的系数)
4.3.2. Step2. PREPROC
生成二进制文件
如果在Configuration启用 Preprocess
,则生成应用程序时将自动创建 PREPROC
二进制文件。
创建的路径是 PREPROC
,在 spresense/examples/audio_recorder/worker/
下。
将此放在SD卡的 /mnt/sd0/BIN
(从PC上查看时为 \BIN
)文件夹。
5. Audio Recognizer 示例应用程序
本章提供Audio Recognizer示例应用程序的操作说明。
5.1. 生成和加载过程
导航到下载的 Spresense SDK 文件夹,然后按照以下步骤生成它:
-
进入
sdk
。cd spresense/sdk
-
配置 NuttX Kernel。
tools/config.py --kernel release
-
配置 SDK。
-
现在,我们将构建一个 Example 应用程序,称为"audio_recognizer",因此我们将指定"examples/audio_recognizer。
tools/config.py examples/audio_recognizer
此配置为audio_recognizer设置。
-
如果要根据识别库的格式处理语音数据,请设置Preprocess 。
捕获的音频采样频率为48kHz或192kHz,位长度为16位或32位。
Audio Recognizer允许根据识别库的输入格式进行预处理。
如果要执行此操作,则必须在配置菜单中启用[Use preprocess]
。
如果捕获的音频按原样输入到识别库中,则可以禁用它。打开配置菜单。
tools/cofig.py -m
选中
[Use preprocess]
。[Examples] [Audio recognizer example] [Use preprocess] <= Y (1)
1 启用前处理 有关Preprocess的详细信息,请参阅SDK开发人员指南中的 set preprocess 。
-
-
编译。
make buildkernel make
详细信息,请参考 编译 。 如果所有步骤都成功,将在
sdk
文件夹中创建名为nuttx.spk
的二进制映像。 -
与Hello示例一样,使用
tools/flash.sh
将生成的映像nuttx.spk
加载到 Spresense 中。tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
-
加载完成并自动重新启动。
-
对于音频Recognizer,需要加载DSP二进制文件才能执行语音识别。 DSP二进制文件的放置位置可以在SD卡或SPI-Flash之间进行选择。 在这里,我们将了解如何从SD卡加载它,因此我们将它放在 "/mnt/sd0/BIN" 中。
当PC读取时,此"/mnt/sd0/BIN"将成为根目录下的
BIN/
。
创建此目录,并将语音识别所需的DSP放在此处。在此示例应用程序中,语音识别的DSP二进制文件设置为使用用户自定义的二进制文件,二进制文件是 spresense/examples/audio_recognizer/worker_recognizer/
下生成为RCGPROC
。如果要执行识别处理,请参考 关于 RecognizerPROC 的自定义 。此外,如果设置了 Preprocess处理 ,应将以下前置二进制文件放在 SD 卡上。
二进制文件PREPROC
在spresense/examples/audio_recognizer/worker_preprocess/
下。在此示例应用程序中, PREPROC
默认包含一个简单的RCfilter。
如果要自定义信号处理等,请参阅 此处。
5.2. 检查Audio Recognizer工作原理
将生成的 nuttx.spk
加载到实际设备中时,将运行Audio Recognizer程序。
与Hello示例一样,打开串行终端。
minicom -D /dev/ttyUSB0 -b 115200 -s
builtin,运行名为 recognizer
的应用时,
开始语音识别。
识别结果由应用程序代码中的回调函数接收。
接收的参数由用于语音识别的 DSP 决定。 请参考 RecognizerProc。
由于数据由MemoryHandle接收,因此可以通过引用地址来检索数据,如下所示。
static void recognizer_find_callback(AsRecognitionInfo info)
{
/* Get Recognition result */
MyRecognizerResultFormat *result =
static_cast<MyRecognizerResultFormat *>(info.getVa())
/* Print result */
...
printf("Data size %d byte\n", info.size);
printf("Data1 : %x, Data2 : %x\n", result->data1, result->data2);
...
}
如果出现错误,请参阅 关于音频子系统错误 中的错误。
5.3. 关于 DSP 二进制自定义
audio_recognizer示例使用两个DSP 二进制文件:用于预处理( PREPROC
)和识别处理( RCGPROC
)。
了解如何自定义它们。
5.3.1. Step1. PREPROC,RCGPROC 代码编辑
了解PREPROC和RCGPROC的代码配置和编辑位置。
代码分为两部分:用户编辑部分 和框架提供的部分。
5.3.1.1. 用户编辑代码
用户应主要编辑的代码。
可以编辑这些代码,以便 DSP 可以编写信号和识别处理。
+ `PREPROC` 位于 `woker_preprocess` 目录中,`RCGPROC` 包含 `worker_recognizer` 中的DSP代码,每个代码都包含 `userproc` 。 + 用户仅在 `userproc` 目录中写入信号、识别等,而不需要更改任何其他信息。 +
main.cpp
包含与启动过程~MainCPU(Supervisor)的数据通信控制,因此不要更改它。
包括启动和DSP通信处理。无需编辑。
定义与预处理DSP通信命令的标头文件。
此文件包含所需的参数。
用于预处理的DSP用户代码的标头文件。
用于预处理的DSP的用户代码正文。
写入或调用此文件,如信号处理。
定义与识别DSP通信命令的标头文件。
此文件包含所需的参数。
用于识别DSP的用户代码头文件。
用于识别DSP的用户代码正文。
在此文件中编写或调用识别过程。
5.3.1.2. 用户代码提供的接口
提供 Init
、 Exec
、 Flush
和 Set
命令框架
用户代码可以通过编写相应的内容来实现DSP中的处理。
描述用户应执行的操作。
(※ 默认情况下, PREPROC
作为示例包含 RC 筛选器。)
命令的DSP内部状态转换如下图所示。
使用每个命令按以下方式处理。
-
当调用 AUDCMD_INIT_RECOGNIZER 时,将启动识别DSP。
-
设置
Init
命令所需的参数,如ch数和位长度。 -
启动识别过程时,捕获的语音数据将定期发送到DSP的
Exec
命令,因此请执行所需的识别过程。 -
如果要随时更改DSP中的参数等,则希望通过发送
Set
命令来实现它。 此命令的执行时间按接收顺序显示,包括Exec
。 -
如果停止识别处理,则在最后一个语音数据
Exec
之后发送Flush
命令,因此,如果需要终止处理,请在此处执行此操作。
定义命令
每个功能使用的数据类型在 PREPROC
中写入 userproc_command.h
,在 RCGPROC
中写入 rcgproc_command.h
,内容可以自由重写。
每个命令的格式如下图所示,在 PREPROC
和 RCGPROC
中是相同的。
顶部白色部分具有固定所需的最小参数。请不要更改它们。
用户在 userproc_command.h
中定义的参数是下图中的 User param
(粉红色部分)。
notification
是 Exec
命令的响应(识别结果)标志,它使用非零规范将响应返回到应用程序。
例如,它通常用于仅在识别结果更改点(无识别→点)时响应,而不返回响应。
描述每个命令。
struct InitRcgParam : public CustomprocCommand::CmdBase
-
用于Init处理的参数。
默认情况下,设置ch数和位宽度。 将其更改为所需的参数。
struct ExecRcgParam : public CustomprocCommand::CmdBase
-
Exec 处理的参数。
语音数据的地址大小在继承的CustomprocCommand::ExecParamBase
中定义,如上图中的ExecParam
中那样。
有关详细信息,请参考/sdk/modules/include/audio/dsp_framework/customproc_command_base.h
。
struct FlushRcgParam : public CustomprocCommand::CmdBase
-
这是 Flush 处理的参数。
语音数据的地址大小在继承的CustomprocCommand::FlushParamBase
中定义,如上图中的ExecParam
中那样。
有关详细信息,请参考/sdk/modules/include/audio/dsp_framework/customproc_command_base.h
。
struct SetRcgParam : public CustomprocCommand::CmdBase
-
用于Set处理的参数。
定义要动态更改的各种参数。默认情况下,它定义识别过程的开/关。
对应于每个功能的函数
以下函数组在 rcgproc.cpp
中编写。内容可以自由重写。
每个 命令定义 执行操作。
void RcgProc::init(InitRcgParam *)
-
InitRcgParam 编写初始化过程。
从应用程序代码的 AUDCMD_INIT_RECOGNIZER_DSP 命令运行。
(默认情况下,Ch数和位宽度设置。)
void RcgProc::exec(ExecRcgParam *)
-
ExecRcgParam 编写信号处理。
开始录制时定期从SDK内部调用。
在此示例应用程序中,一帧是320个样本(可以在应用程序中自由更改它)。
从输入数据地址获取数据,执行识别过程,并将结果写入输出数据地址。
(默认情况下,输出输入帧中样本值的最大、最小和平均值。)
void RcgProc::flush(FlushRcgParam *)
-
按照 FlushRcgParam 编写Flush(终止)处理。
停止录制时,仅在SDK内部调用一次。
如果识别过程出现帧延迟,请在最终帧后执行flush
以输出延迟。
如果要输出任何数据,请写入输出数据地址。
(默认情况下,无操作。)
void RcgProc::set(SetRcgParam *)
-
请根据 SetRcgParam ,编写设置过程。
使用应用程序代码中的 AUDCMD_SET_RECOGNIZER_DSP 命令运行。
(默认情况下,设置识别过程的On/Off。)
5.3.2. Step2. PREPROC
、 RCGPROC
二进制文件的生成
生成此应用程序时,将自动创建 RCGPROC
二进制文件。
此外,如果在 Configuration 中启用了 Preprocess
,则还会创建 PREPROC
二进制文件。
创建的路径是 RCGPROC
下的 worker_recognizer/
,在 worker_preprocess/
下为 PREPROC
。
将此放在SD卡的 /mnt/sd0/BIN
(从 PC 上查看时为 \BIN
)文件夹。
6. Zmodem 传输文件
本章演示如何使用Zmodem传输在主机PC和Spresense板之间发送和接收文件。
6.1. 编译和加载过程
进入 Spresense SDK 文件夹,然后按照以下步骤编译:
-
进入
sdk
目录。cd spresense/sdk
-
配置Nuttx Kernel。
tools/config.py --kernel release
-
配置SDK。
现在,将构建名为zmodem
的系统工具,并指定feature/zmodem
。tools/config.py feature/zmodem
有关配置的详细信息,请参阅 配置 。 -
编译。
make buildkernel make
详细信息,请参考 编译 。 如果所有步骤都成功,将在
sdk
文件夹中创建名为nuttx.spk
的二进制映像。 -
使用
tools/flash.sh
将生成的映像nuttx.spk
加载到 Spresense 板上。tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
-
加载完成并自动重新启动。
6.2. 操作说明
使用支持Zmodem传输功能的串行终端。
下面是一个示例minicom。
如果未安装minicom或lrzzz,请预安装它。
sudo apt install minicom lrzsz
启动 minicom。
minicom -D /dev/ttyUSB0 -b 115200
可以使用来自NuttShell中Zmodem的rz(接收)和sz(发送)命令。
- 使用rz命令
-
- 使用sz命令
-
6.2.1. 从主机PC传输文件到Spresense板
以下是将文件从主机PC传输到Spresense板的步骤:
-
在minicom上按
CTRL-a
,然后按z
打开菜单。(此快捷键的分配由用户更改。有关详细信息,请参阅minicom文档。)
继续按s
键选择Send files发送文件。 -
使用光标键选择 zmodem 并使用
Enter
键运行。 -
使用光标键和空格键移动文件夹,然后选择要传输的文件。
使用光标键选择文件夹,然后按空格键两次以导航到文件夹。
使用光标键选择文件,使用空格键选择文件,然后按Enter
开始传输。或者,可以按
Enter
输入文件名以执行传输。 -
如果文件传输开始,并且显示为Transfer complete,则传输已完成。
-
可以在CONFIG_SYSTEM_ZMODEM_MOUNTPOINT中更改Spresense板上的文件目标。
默认配置将文件传输到Flash上的/mnt/spif
以下。
使用TeraTerm时,可以从菜单中发送 Files → Transfer → ZMODEM → Send 中选择的文件。
|
6.2.2. 从Spresense板传输文件到主机PC
以下是将文件从Spresense板传输到主机PC的步骤。
-
在NuttShell上,指定要传输到
sz
命令参数的文件。
文件名为 / 输入以完整路径名称开头的文件名。
下面的示例具有-x 1
二进制传输选项。nsh> sz -x 1 /mnt/spif/test00.dat
-
如果文件传输开始,并且显示为Transfer complete,则传输已完成。
-
将文件传输到在HostPC上运行minicom的文件夹。
如果使用TeraTerm,则可以在从NuttShell中输入 sz 命令后,通过 Files → Transfer → ZMODEM → Receive 接收文件。 HostPC 端的文件接收目录位于 Files → Change Directory 。
|
7. 自动启动应用程序方法
本章介绍如何在启动时自动启动用户应用程序,而不是NuttShell提示。
7.1. 启动脚本
通过准备启动脚本,系统启动时,它将按照该脚本运行。
使用此功能,打开电源后可以自动执行任何用户应用程序。
启动脚本可以包括NuttShell命令,包括用户应用程序和简单的控制语法,例如if和while。
详细信息,请参考 NuttShell 文件 。
7.1.1. 使用脚本
在这里,作为示例,尝试将examples/hello应用程序设置为自动启动。
(省略了有关NuttX内核的配置和构建的说明。)
-
启用hello应用程序并打开menuconfig配置菜单。
./tools/config.py -m examples/hello
-
启用
Support ROMFS start-up script
。System tools --> NSH Library ---> Scripting Support
-
选择
ROMFS header location
作为Custom ROMFS header path
。 在Custom ROMFS header file path
中,输入../../nsh_romfsimg.h
并保存配置。指定 nsh_romfsimg.h
相对于sdk/system/nshlib目录的位置。 -
接下来,直接在sdk目录下创建一个名为
rcS.template
的启动脚本。
在此,作为示例,如下描述echo
命令和hello
命令。cat spresense/sdk/rcS.template echo Start-up hello application hello
-
使用
mkromfsimg.sh
工具从rcS.template
生成nsh_romfsimg.h
。cd spresense/sdk ./tools/mkromfsimg.sh . ls nsh_romfsimg.h nsh_romfsimg.h
-
将以通常方式编译的二进制文件烧入Spresense板。
make tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
-
打开电源时,可以在显示NuttShell之前确认脚本中编写的hello应用程序正在运行。
7.1.2. 更改脚本位置
如果要更改 rcS.template
的位置,请参考以下内容。
-
例如,将
rcS.template
放在spresense/examples/hello下。cat spresense/examples/hello/rcS.template echo Start-up hello application hello
-
使用
rcS.template
所在目录中的mkromfsimg.sh
工具生成nsh_romfsimg.h
。cd spresense/examples/hello ../../sdk/tools/mkromfsimg.sh ../../sdk ls nsh_romfsimg.h nsh_romfsimg.h
-
打开配置菜单
在Cutom ROMFS header file path
中,输入../../../examples/hello/nsh_romfsimg.h
。指定 nsh_romfsimg.h
相对于sdk/system/nshlib目录的位置。 -
其余的编译过程与之前相同。
7.2. SDK 入口点
您也可以与启动脚本分开更改CONFIG_SDK_USER_ENTRYPOINT。
在默认配置中,CONFIG_SDK_USER_ENTRYPOINT = nsh_main。
如果将其更改为例如hello_main,则可以更改为在启动时启动hello应用程序。
启动时需要应用程序初始化。引用以下内容添加#include <sys/boardctl.h>,然后从用户入口点函数调用boardctl(BOARDIOC_INIT,0)。 |
#include <sys/boardctl.h>
#ifdef CONFIG_BUILD_KERNEL
int main(int argc, FAR char *argv[])
#else
int hello_main(int argc, char *argv[])
#endif
{
/* Initialize apllication */
boardctl(BOARDIOC_INIT, 0);
printf("Hello, World!!\n");
return 0;
}