Demo:Basical case:修订间差异
小 武楷轩移动页面Demo:bflog至Demo:Basical case |
Basical 1 |
||
| 第1行: | 第1行: | ||
== 前言 == | |||
'''该页面将介绍一些较为简单基础的测试case 功能,目前包括 freertos;log等级输出;boot2;这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。''' | |||
=== 源码编译: === | |||
在该文件夹下有一个README.md文件,该文件中根据不同的开发板型号有不同编译的参数,例如bl616 : | |||
- BL616/BL618 | |||
``` | |||
make CHIP=bl616 BOARD=bl616dk | |||
``` | |||
#以上为README文件中的内容,根据内容直接执行对应make编译指令即可 | |||
make如果成功,你会在终端看到: | |||
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin '''代表生成了对应可供烧录的固件'''。 | |||
=== 开发板烧录: === | |||
执行make命令后,在该文件夹下会生成一个build目录,在文件夹中有一个生成的固件 freertos_bl616.bin ,该文件用于烧录直接使用(类似于keil生成的.hex文件)。 | |||
其具体路径为 '''.../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin''' | |||
==== 下载烧录工具: ==== | |||
下载BLDevCube工具:下载后解压即可直接使用。 | |||
<nowiki>https://dev.bouffalolab.com/</nowiki> | |||
'''烧录具体步骤:''' | |||
Step1:打开DevCube选择对应开发板型号。 | |||
Step2:选择对应的 .bin 文件,选择对应的串口。 | |||
'''注意:要选择IOT并勾选enable''' | |||
Step3: | |||
'''按住boot键按一下复位键(按复位时boot键不松开),然后点击Create & Download'''。查看下方的输出信息是否烧录成功。 | |||
== Demo:FreeRTOS == | |||
在Bouffalo SDK上使用FreeRTOS APP | |||
=== 源码介绍: === | |||
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中,该测试 demo 简单测试了一些组件,包括Semaphore,Mutex,Queue,Priority 的基本简单测试。 | |||
测试分为两个阶段: | |||
阶段一以消费者生产者模型测试'''信号量'''和'''信号队列'''组件,共生成三个Task。阶段结束后Task自动销毁。 | |||
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试'''互斥量''',途中高优先级的任务将启动并占用CPU一段时间以此测试抢占'''任务调度'''。 | |||
=== 源码部分输出: === | |||
[FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test ===== | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks... | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task... | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1) | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501) | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001) | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty | |||
..... | |||
[FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test ===== | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task... | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks... | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired. | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1 | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex | |||
..... | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired. | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5 | |||
..... | |||
[FREERTOS_TEST CONSOLE] ===== END PHASE 2 ===== | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired. | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11 | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change | |||
[FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete. | |||
== Demo:bflog == | |||
=== Demo介绍: === | === Demo介绍: === | ||
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下,主要测试该开发板不同级别的log输出功能; | 该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下,主要测试该开发板不同级别的log输出功能; | ||
| 第82行: | 第177行: | ||
'''部分输出:''' | '''部分输出:''' | ||
== Demo:helloworld == | |||
=== Demo介绍: === | |||
该demo测试基本日志等级输出,该Demo是对bflog加了一层封装,比如控制日志输出等级,控制是否使用严重等级颜色输出。 | |||
保存路径: bouffalo_sdk/examples/helloworld | |||
在当前默认情况下的输出如下: | |||
=========================== | |||
uart sig1:ffffffff, sig2:0000f32f | |||
clock gen1:9ffffffd, gen2:0fff0c11 | |||
xtal:40000000Hz(crystal) | |||
board init done | |||
=========================== | |||
[F][MAIN] hello world fatal | |||
[E][MAIN] hello world error | |||
[W][MAIN] hello world warning | |||
[I][MAIN] hello world information | |||
hello world fatal raw | |||
hello world error raw | |||
hello world warning raw | |||
hello world information raw | |||
通过代码对应可以看到部分代码没有输出,部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出: | |||
#if (CONFIG_LOG_LEVEL >= 4) | |||
#define LOG_D(...) BFLOG_D((void *)&__bflog_recorder, __VA_ARGS__) | |||
#define LOG_RD(...) BFLOG_RD((void *)&__bflog_recorder, __VA_ARGS__) | |||
#else | |||
#define LOG_D(...) ((void)0) | |||
#define LOG_RD(...) ((void)0) | |||
#endif | |||
#if (CONFIG_LOG_LEVEL >= 5) | |||
#define LOG_T(...) BFLOG_T((void *)&__bflog_recorder, __VA_ARGS__) | |||
#define LOG_RT(...) BFLOG_RT((void *)&__bflog_recorder, __VA_ARGS__) | |||
#else | |||
#define LOG_T(...) ((void)0) | |||
#define LOG_RT(...) ((void)0) | |||
#endif | |||
是否有颜色则取决于是否带有R,在引用文件中可以看到: | |||
#define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__) | |||
以上配置可以在同级目录下的 proj.conf 中。 | |||
== Demo:log_dbg_assert == | |||
这部分代码和Demo:helloworld 基本一致,但是多了测试断言输出的功能。 | |||
保存在 SDK 下的: bouffalo_sdk/examples/log_dbg_assert | |||
在代码中先进行了一个阶乘的递归函数,每一次递归以及判读啊都会输出断言信息以此测试断言输出。 | |||
示例输出:<syntaxhighlight lang="bash" line="1"> | |||
[I][MAIN] message = "hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui" | |||
[I][MAIN] message (size: 138): | |||
00000000: 68 65 6c 6c 6f 6b 73 7a 68 64 66 6f 69 61 73 6a 'hellokszhdfoiasj' | |||
00000010: 64 6b 6a 6e 73 6b 6a 78 6e 76 75 69 6f 6c 61 73 'dkjnskjxnvuiolas' | |||
00000020: 68 64 66 6f 69 6e 61 73 6b 6a 6c 64 66 6e 76 6b 'hdfoinaskjldfnvk' | |||
00000030: 6c 61 73 6a 68 64 66 69 32 31 33 34 38 39 6f 37 'lasjhdfi213489o7' | |||
00000040: 31 32 33 34 35 38 39 30 37 33 32 39 38 64 66 6c '1234589073298dfl' | |||
00000050: 3b 61 73 6a 64 6c 66 6e 6b 6a 7a 78 6e 63 76 68 ';asjdlfnkjzxncvh' | |||
00000060: 61 73 64 6c 6b 66 6c 6a 68 61 73 6a 6b 6c 64 6a 'asdlkfljhasjkldj' | |||
00000070: 68 6e 76 6a 6b 61 73 6c 6e 64 66 76 6b 6c 6a 61 'hnvjkaslndfvklja' | |||
00000080: 73 68 64 6c 69 66 68 75 69 00 'shdlifhui.' | |||
[I][MAIN] 3 * a = 6 (0x6) | |||
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512) | |||
[I][MAIN] n <= 1 = false | |||
[I][MAIN] n <= 1 = false | |||
[I][MAIN] n <= 1 = false | |||
[I][MAIN] n <= 1 = true | |||
[I][MAIN] 1 = 1 (0x1) | |||
[I][MAIN] n * factorial(n - 1) = 2 (0x2) | |||
[I][MAIN] n * factorial(n - 1) = 6 (0x6) | |||
[I][MAIN] n * factorial(n - 1) = 24 (0x18) | |||
[I][MAIN] factorial(4) = 24 (0x18) | |||
[I][MAIN] n <= 1 = false | |||
[I][MAIN] n <= 1 = false | |||
[I][MAIN] n <= 1 = false | |||
[I][MAIN] n <= 1 = true | |||
[I][MAIN] 1 = 1 (0x1) | |||
....... | |||
1 == factorial(4) but 1 = 1 , factorial(4) = 24 | |||
error handler | |||
[F][MAIN] hello world fatal | |||
[E][MAIN] hello world error | |||
[W][MAIN] hello world warning | |||
[I][MAIN] hello world information | |||
hello world fatal raw | |||
hello world error raw | |||
hello world warning raw | |||
hello world information raw | |||
[F][MAIN] hello world fatal | |||
[E][MAIN] hello world error | |||
[W][MAIN] hello world warning | |||
[I][MAIN] hello world information | |||
</syntaxhighlight> | |||
== Demo:boot2 isp == | |||
这部分代码是一个bootloader程序,具备 '''安全启动'''、'''双分区更新'''、'''压缩支持'''、'''多核管理''' 等工业级特性。 | |||
该demo存放在 SDK 下的:/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。 | |||
=== 主要功能 === | |||
# '''分区表''': | |||
#* 读取并验证分区表(<code>pt_table_stuff</code>),确定活动分区(<code>active_id</code>) | |||
#* 支持 A/B 双分区设计,实现无缝固件更新和回滚 | |||
#* 处理分区条目,包括固件位置、大小、版本号 | |||
# '''固件加载与启动''': | |||
#* 该程序会根据分区表加载固件到内存 | |||
#* 支持压缩固件:XZ 格式的解压<code>blsp_boot2_check_xz_fw</code> | |||
#* 多核支持: <code>BLSP_BOOT2_CPU_GROUP_MAX</code> 定义 CPU 数量 | |||
# '''固件更新''': | |||
#* OTA 更新:将新固件从临时分区复制到主分区 | |||
#* 防回滚(Anti-Rollback):防止降级到不安全版本 | |||
#* 支持 USB/UART 烧录模式,对应代码:<code>bflb_eflash_loader_main</code> | |||
# '''安全''': | |||
#* SHA-256 校验 | |||
#* 具有固件完整性检查 | |||
您可以在开发板存在其他 App 的同时烧录该 bin ,'''这并不会覆盖掉你的程序,而是只为开发板更换 bootloader'''. | |||
2025年8月5日 (二) 07:16的版本
前言
该页面将介绍一些较为简单基础的测试case 功能,目前包括 freertos;log等级输出;boot2;这一小节将会为您先详细介绍如何 编译 烧录 如何下载烧录工具等基本信息。
源码编译:
在该文件夹下有一个README.md文件,该文件中根据不同的开发板型号有不同编译的参数,例如bl616 :
- BL616/BL618 ``` make CHIP=bl616 BOARD=bl616dk ``` #以上为README文件中的内容,根据内容直接执行对应make编译指令即可
make如果成功,你会在终端看到:
Generate .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin 代表生成了对应可供烧录的固件。
开发板烧录:
执行make命令后,在该文件夹下会生成一个build目录,在文件夹中有一个生成的固件 freertos_bl616.bin ,该文件用于烧录直接使用(类似于keil生成的.hex文件)。
其具体路径为 .../bouffalo_sdk/examples/freertos/build/build_out/freertos_bl616.bin
下载烧录工具:
下载BLDevCube工具:下载后解压即可直接使用。
https://dev.bouffalolab.com/
烧录具体步骤:
Step1:打开DevCube选择对应开发板型号。
Step2:选择对应的 .bin 文件,选择对应的串口。
注意:要选择IOT并勾选enable
Step3:
按住boot键按一下复位键(按复位时boot键不松开),然后点击Create & Download。查看下方的输出信息是否烧录成功。
Demo:FreeRTOS
在Bouffalo SDK上使用FreeRTOS APP
源码介绍:
该文件的源码在 bouffalo_sdk/examples/freertos/main.c中,该测试 demo 简单测试了一些组件,包括Semaphore,Mutex,Queue,Priority 的基本简单测试。
测试分为两个阶段:
阶段一以消费者生产者模型测试信号量和信号队列组件,共生成三个Task。阶段结束后Task自动销毁。
阶段二以共简单共享资源简单测试Task争夺临界资源的方式测试互斥量,途中高优先级的任务将启动并占用CPU一段时间以此测试抢占任务调度。
源码部分输出:
[FREERTOS_TEST CONSOLE] ===== PHASE 1: Queue/Semaphore Test ===== [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting consumer tasks... [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task]: Starting producer task... [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: task started [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: task started [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1) [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: received msg (task:1, ts:501) [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: message send success [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: received msg (task:1, ts:1001) [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: queue empty ..... [FREERTOS_TEST CONSOLE] ===== PHASE 2: Priority/Mutex Test ===== [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 1]: Exiting due to phase change [FREERTOS_TEST CONSOLE] [I][MAIN] [Consumer 2]: Exiting due to phase change [FREERTOS_TEST CONSOLE] [I][MAIN] [Producer 1]: Exiting due to phase change [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting High Priority task... [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] Starting Shared Resource tasks... [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired. [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 1 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Attempt to acquire mutex ..... [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Holding mutex for 500ms [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Attempt to acquire mutex [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: High priority task running [FREERTOS_TEST CONSOLE] [I][MAIN] [High Priority Task]: Completed [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired. [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 5 ..... [FREERTOS_TEST CONSOLE] ===== END PHASE 2 ===== [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Release mutex [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Aquired. [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: value = 11 [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Holding mutex for 500ms [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 4]: Exiting due to phase change [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Release mutex [FREERTOS_TEST CONSOLE] [I][MAIN] [Mutex Task 3]: Exiting due to phase change [FREERTOS_TEST CONSOLE] [I][MAIN] [Process Task] All Test Complete.
Demo:bflog
Demo介绍:
该部分代码储存在 bouffalo_sdk/examples/bflog/barebone_sync 路径下,主要测试该开发板不同级别的log输出功能;
filter对输出日志的过滤功能。bflog分为五个级别,分别为:
| 日志等级 | 说明 | 基本应用场景 |
|---|---|---|
| FATL | 致命错误(Fatal) | 系统无法继续运行的灾难性事件(如核心崩溃、数据损坏),需立即人工干预并终止程序。 |
| ERRO | 错误(Error) | 影响当前操作的关键错误(如功能失效、外部服务异常),但系统仍可部分运行,需尽快处理。 |
| WARN | 警告(Warning) | 非关键性异常或潜在风险(如配置降级、资源不足),需关注但无需立即行动。 |
| INFO | 信息(Info) | 常规运行状态记录(如服务启动、关键操作完成),用于监控系统健康状态。 |
| DBUG | 调试(Debug) | 开发/测试阶段的详细运行细节(如变量值、逻辑分支),用于定位问题原因。 |
| TRAC | 跟踪(Trace) | 最细粒度的执行路径追踪(如函数调用栈、循环过程),用于深度分析复杂逻辑。 |
barebone_sync:
该部分主要是裸机测试了以上的各个等级log输出,filter过滤。
部分输出:
===========================
uart sig1:ffffffff, sig2:0000f32f
clock gen1:9ffffffd, gen2:0fff0c11
xtal:40000000Hz(crystal)
board init done
===========================
============================== enable all output
[FATL][ 25338][2022-12-16 17:51:40][main.c:main:130]<MAIN> hello world this is fatal error
[ERRO][ 25858][2022-12-16 17:51:40][main.c:main:131]<MAIN> hello world this is error
[WARN][ 26355][2022-12-16 17:51:40][main.c:main:132]<MAIN> hello world this is warning
[INFO][ 26864][2022-12-16 17:51:40][main.c:main:133]<MAIN> hello world this is information
[DBUG][ 27374][2022-12-16 17:51:40][main.c:main:134]<MAIN> hello world this is degug information
[TRAC][ 27934][2022-12-16 17:51:40][main.c:main:135]<MAIN> hello world this is trace information
[FATL][ 28492][2022-12-16 17:51:40][log_test.c:test_log:13]<TEST> hello test this is fatal error
[ERRO][ 29049][2022-12-16 17:51:40][log_test.c:test_log:14]<TEST> hello test this is error
[WARN][ 29580][2022-12-16 17:51:40][log_test.c:test_log:15]<TEST> hello test this is warning
[INFO][ 30119][2022-12-16 17:51:40][log_test.c:test_log:16]<TEST> hello test this is information
[DBUG][ 30660][2022-12-16 17:51:40][log_test.c:test_log:17]<TEST> hello test this is degug information
[TRAC][ 31248][2022-12-16 17:51:40][log_test.c:test_log:18]<TEST> hello test this is trace information
============================== enable only MAIN output
[FATL][ 1031983][2022-12-16 17:51:41][log_test.c:test_log:13]<TEST> hello test this is fatal error
[ERRO][ 1032537][2022-12-16 17:51:41][log_test.c:test_log:14]<TEST> hello test this is error
[WARN][ 1033066][2022-12-16 17:51:41][log_test.c:test_log:15]<TEST> hello test this is warning
[INFO][ 1033606][2022-12-16 17:51:41][log_test.c:test_log:16]<TEST> hello test this is information
[DBUG][ 1034146][2022-12-16 17:51:41][log_test.c:test_log:17]<TEST> hello test this is degug information
[TRAC][ 1034736][2022-12-16 17:51:41][log_test.c:test_log:18]<TEST> hello test this is trace information
============================== disable all output
freertos_async:
该部分测试了在FreeRTOS下log的输出是否正常。
该case创建了两个任务,消费者和生产者,从信号队列中进行获取和放入的经典场景来测试log。
消费者任务和生产者任务具体代码放在同目录下的: thread_consumer; thread_producer;中。
部分输出:
Demo:helloworld
Demo介绍:
该demo测试基本日志等级输出,该Demo是对bflog加了一层封装,比如控制日志输出等级,控制是否使用严重等级颜色输出。
保存路径: bouffalo_sdk/examples/helloworld
在当前默认情况下的输出如下:
=========================== uart sig1:ffffffff, sig2:0000f32f clock gen1:9ffffffd, gen2:0fff0c11 xtal:40000000Hz(crystal) board init done =========================== [F][MAIN] hello world fatal [E][MAIN] hello world error [W][MAIN] hello world warning [I][MAIN] hello world information hello world fatal raw hello world error raw hello world warning raw hello world information raw
通过代码对应可以看到部分代码没有输出,部分代码有颜色而部分代码没有颜色。 没有输出的部分是因为 LOG_LEVEL 的定义级别导致没有输出:
#if (CONFIG_LOG_LEVEL >= 4) #define LOG_D(...) BFLOG_D((void *)&__bflog_recorder, __VA_ARGS__) #define LOG_RD(...) BFLOG_RD((void *)&__bflog_recorder, __VA_ARGS__) #else #define LOG_D(...) ((void)0) #define LOG_RD(...) ((void)0) #endif #if (CONFIG_LOG_LEVEL >= 5) #define LOG_T(...) BFLOG_T((void *)&__bflog_recorder, __VA_ARGS__) #define LOG_RT(...) BFLOG_RT((void *)&__bflog_recorder, __VA_ARGS__) #else #define LOG_T(...) ((void)0) #define LOG_RT(...) ((void)0) #endif
是否有颜色则取决于是否带有R,在引用文件中可以看到:
#define BFLOG_RF(_log, ...) BFLOG_X(_log, BFLOG_LEVEL_RAW | BFLOG_LEVEL_FATAL, (BFLOG_TAG), ##__VA_ARGS__)
以上配置可以在同级目录下的 proj.conf 中。
Demo:log_dbg_assert
这部分代码和Demo:helloworld 基本一致,但是多了测试断言输出的功能。
保存在 SDK 下的: bouffalo_sdk/examples/log_dbg_assert
在代码中先进行了一个阶乘的递归函数,每一次递归以及判读啊都会输出断言信息以此测试断言输出。
示例输出:
[I][MAIN] message = "hellokszhdfoiasjdkjnskjxnvuiolashdfoinaskjldfnvklasjhdfi213489o71234589073298dfl;asjdlfnkjzxncvhasdlkfljhasjkldjhnvjkaslndfvkljashdlifhui"
[I][MAIN] message (size: 138):
00000000: 68 65 6c 6c 6f 6b 73 7a 68 64 66 6f 69 61 73 6a 'hellokszhdfoiasj'
00000010: 64 6b 6a 6e 73 6b 6a 78 6e 76 75 69 6f 6c 61 73 'dkjnskjxnvuiolas'
00000020: 68 64 66 6f 69 6e 61 73 6b 6a 6c 64 66 6e 76 6b 'hdfoinaskjldfnvk'
00000030: 6c 61 73 6a 68 64 66 69 32 31 33 34 38 39 6f 37 'lasjhdfi213489o7'
00000040: 31 32 33 34 35 38 39 30 37 33 32 39 38 64 66 6c '1234589073298dfl'
00000050: 3b 61 73 6a 64 6c 66 6e 6b 6a 7a 78 6e 63 76 68 ';asjdlfnkjzxncvh'
00000060: 61 73 64 6c 6b 66 6c 6a 68 61 73 6a 6b 6c 64 6a 'asdlkfljhasjkldj'
00000070: 68 6e 76 6a 6b 61 73 6c 6e 64 66 76 6b 6c 6a 61 'hnvjkaslndfvklja'
00000080: 73 68 64 6c 69 66 68 75 69 00 'shdlifhui.'
[I][MAIN] 3 * a = 6 (0x6)
[I][MAIN] numbers = [7,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] (length: 512)
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = true
[I][MAIN] 1 = 1 (0x1)
[I][MAIN] n * factorial(n - 1) = 2 (0x2)
[I][MAIN] n * factorial(n - 1) = 6 (0x6)
[I][MAIN] n * factorial(n - 1) = 24 (0x18)
[I][MAIN] factorial(4) = 24 (0x18)
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = false
[I][MAIN] n <= 1 = true
[I][MAIN] 1 = 1 (0x1)
.......
1 == factorial(4) but 1 = 1 , factorial(4) = 24
error handler
[F][MAIN] hello world fatal
[E][MAIN] hello world error
[W][MAIN] hello world warning
[I][MAIN] hello world information
hello world fatal raw
hello world error raw
hello world warning raw
hello world information raw
[F][MAIN] hello world fatal
[E][MAIN] hello world error
[W][MAIN] hello world warning
[I][MAIN] hello world information
Demo:boot2 isp
这部分代码是一个bootloader程序,具备 安全启动、双分区更新、压缩支持、多核管理 等工业级特性。
该demo存放在 SDK 下的:/home/user/FromGit/bouffalo_sdk/examples/boot2_isp 路径下。
主要功能
- 分区表:
- 读取并验证分区表(
pt_table_stuff),确定活动分区(active_id) - 支持 A/B 双分区设计,实现无缝固件更新和回滚
- 处理分区条目,包括固件位置、大小、版本号
- 读取并验证分区表(
- 固件加载与启动:
- 该程序会根据分区表加载固件到内存
- 支持压缩固件:XZ 格式的解压
blsp_boot2_check_xz_fw - 多核支持:
BLSP_BOOT2_CPU_GROUP_MAX定义 CPU 数量
- 固件更新:
- OTA 更新:将新固件从临时分区复制到主分区
- 防回滚(Anti-Rollback):防止降级到不安全版本
- 支持 USB/UART 烧录模式,对应代码:
bflb_eflash_loader_main
- 安全:
- SHA-256 校验
- 具有固件完整性检查
您可以在开发板存在其他 App 的同时烧录该 bin ,这并不会覆盖掉你的程序,而是只为开发板更换 bootloader.