file-type

rt-thread&stm32串口数据测试结论:消息队列方式分析

PDF文件

下载需积分: 50 | 177KB | 更新于2024-08-10 | 63 浏览量 | 18 下载量 举报 收藏
download 立即下载
"rt-thread&stm32 消息队列方式实现串口数据不定长接收的测试结论" 本文档详细阐述了基于rt-thread实时操作系统和STM32微控制器的串口数据不定长接收测试的过程与结论。测试的主要目的是评估软件性能,提供缺陷修正依据,并增强用户对系统的信任。文档引用了相关参考资料,包括需求分析和设计规范。 测试对象明确,包括具体的测试项目、测试类型、测试批次和时间。测试分析部分深入剖析了测试结果,列出了BUG分布表和分布图,按照错误等级A至E进行了统计。数据显示,B级错误占比最高,达到74%,其次是A级9%,C级13%,而D级和E级分别占0%。对比分析环节,若非首次测试,会对比历史测试结果,以便找出改进趋势。测试评估则对软件能力进行全面分析,指出遗留问题、局限性和约束,同时提出改进建议。 软件测试规范部分详细介绍了软件测试的理论、流程、类型、黑盒和白盒测试方法,以及测试错误类型和标准。软件测试不仅是发现和修复错误的关键环节,而且是确保软件规格、设计和编码质量的最后防线。测试涵盖了模块测试、子系统测试、系统测试和验收测试等不同阶段,使用了如等价类划分、因果图、边值分析法等黑盒测试技术,以及语句覆盖、判定覆盖等白盒测试技术。 测试错误类型部分可能包括功能错误、性能问题、兼容性问题、安全漏洞等。测试标准则为评估测试结果提供了依据,确保测试的公正性和一致性。测试报告和文档,如单元测试报告、集成测试报告、测试大纲、测试计划等,都是软件测试过程中的重要组成部分,它们记录了测试的详细过程和结果,有助于后续的问题追踪和优化。 总结测试结论时,测试主管会根据测试标准和测试结果,决定软件是否达到可接受的质量水平。如果测试未通过,将需要进一步的调试和修复,直到满足标准为止。 通过以上分析,可以得出rt-thread&stm32串口数据接收模块的测试情况,为后续的软件开发和优化提供了宝贵的数据支持和改进建议。

相关推荐

filetype

/* * 程序清单:这是一个串口设备 开启 DMA 模式后使用例程 * 例程导出了 uart_dma_sample 命令到控制终端 * 命令调用格式:uart_dma_sample uart1 * 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备 * 程序功能:通过串口输出字符串 "hello RT-Thread!",并通过串口输出接收到的数据,然后打印接收到的数据。 */ #include <rtthread.h> #include <rtdevice.h> #define SAMPLE_UART_NAME "uart1" /* 串口设备名称 */ /* 串口接收消息结构 */ struct rx_msg { rt_device_t dev; rt_size_t size; }; /* 串口设备句柄 */ static rt_device_t serial; /* 消息队列控制块 */ static struct rt_messagequeue rx_mq; /* 接收数据回调函数 */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { struct rx_msg msg; rt_err_t result; msg.dev = dev; msg.size = size; result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); if (result == -RT_EFULL) { /* 消息队列满 */ rt_kprintf("message queue full!\n"); } return result; } static void serial_thread_entry(void *parameter) { struct rx_msg msg; rt_err_t result; rt_uint32_t rx_length; static char rx_buffer[BSP_UART1_RX_BUFSIZE + 1]; while (1) { rt_memset(&msg, 0, sizeof(msg)); /* 从消息队列中读取消息 */ result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (result > 0) { /* 从串口读取数据 */ rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); rx_buffer[rx_length] = '\0'; /* 通过串口设备 serial 输出读取到的消息 */ rt_device_write(serial, 0, rx_buffer, rx_length); /* 打印数据 */ rt_kprintf("%s\n",rx_buffer); } } } static int uart_dma_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX]; static char msg_pool[256]; char str[] = "hello RT-Thread!\r\n"; if (argc == 2) { rt_strncpy(uart_name, argv[1], RT_NAME_MAX); } else { rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); } /* 查找串口设备 */ serial = rt_device_find(uart_name); if (!serial) { rt_kprintf("find %s failed!\n", uart_name); return RT_ERROR; } /* 初始化消息队列 */ rt_mq_init(&rx_mq, "rx_mq", msg_pool, /* 存放消息的缓冲区 */ sizeof(struct rx_msg), /* 一条消息的最大长度 */ sizeof(msg_pool), /* 存放消息的缓冲区大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ /* 以 DMA 接收及轮询发送方式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); /* 设置接收回调函数 */ rt_device_set_rx_indicate(serial, uart_input); /* 发送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { ret = RT_ERROR; } return ret; } 根据此代码 使用串口2解析sbus乐迪接收器代码

filetype

基于 STM32 和 RT-Thread 的中断处理代码示例 以下是一个完整的基于 STM32 和 RT-Thread 的外部中断处理代码示例。该示例展示了如何配置 GPIO 引脚作为外部中断源,并在中断发生时执行相应的回调函数。 -------------------------------------------------------------------------------- 1. 初始化 GPIO 和中断 首先需要初始化 GPIO 引脚并将其中断模式设置为下降沿触发(或其他所需的触发模式)。以下是初始化部分的代码: #include "rtthread.h" #include "drv_gpio.h" #define EXT_PIN GET_PIN(B, 14) // 使用 PB14 作为外部中断引脚 static void exti_config(void) { rt_pin_mode(EXT_PIN, PIN_MODE_INPUT); // 设置引脚为输入模式 rt_pin_attach_irq(EXT_PIN, PIN_IRQ_MODE_FALLING, NULL, NULL); // 绑定下降沿中断 rt_pin_irq_enable(EXT_PIN, PIN_IRQ_ENABLE); // 启用中断 } -------------------------------------------------------------------------------- 2. 定义中断服务程序 接下来定义一个中断服务程序 (ISR),当外部中断触发时会调用这个函数。这里我们简单打印一条日志消息来确认中断已触发。 static void exti_handler(struct rt_device *device, int irq_num) { rt_kprintf("External Interrupt Triggered on Pin %d!\n", irq_num); // 打印中断信息 } // 注册中断服务程序 static void register_exti_handler(void) { rt_pin_attach_irq(EXT_PIN, PIN_IRQ_MODE_FALLING, exti_handler, NULL); // 绑定 ISR } -------------------------------------------------------------------------------- 3. 主函数中的初始化和测试 最后,在 main 函数中调用上述初始化函数,并进入主循环等待中断触发。 int main(void) { /* 系统初始化 */ rt_hw_board_init(); /* 配置外部中断 */ exti_config(); register_exti_handler(); // 注册中断服务程序 while (1) { rt_thread_mdelay(1000); // 每秒延迟一次,保持主线程运行 } return RT_EOK; } -------------------------------------------------------------------------------- 关键点说明 1.GPIO 配置 使用 rt_pin_mode 将引脚设置为输入模式,并通过 rt_pin_attach_irq 绑定中断触发条件(如上升沿、下降沿或双边沿)。 2.中断使能 调用 rt_pin_irq_enable 启用中断功能。如果不启用,则即使满足触发条件也不会进入中断服务程序。 3.中断服务程序 (ISR) 中断服务程序由 rt_pin_attach_irq 动态绑定,可以在其中执行任何必要的业务逻辑。注意避免在 ISR 中执行耗时操作,以免影响系统的实时性能。 4.RT-Thread 抽象层的优势 RT-Thread 提供了统一的设备驱动框架,使得不同平台间的移植更加方便。开发者无需关心底层硬件细节即可快速实现功能模块。 -------------------------------------------------------------------------------- 这里是软中断还是硬中断