[英]How to run stm32 unit tests on Linux PC?
我正在嘗試在我的 linux 機器上對一些 STM32 代碼進行單元測試(使用 unity+ceedling),但每次我訪問任何寄存器時,代碼都會失敗並出現此錯誤:
> Produced no final test result counts in $stdout:
Segmentation fault (core dumped)
> And exited with status: [0] (count of failed tests).
> This is often a symptom of a bad memory access in source or test code
例如,此代碼將導致通過 1/1(請注意,我正在測試返回 a+b 且與 STM 外設無關的 function)。
#include "unity.h"
#include "sum2nums.h"
#include "stm32f4xx.h"
void test_Sum(){
TEST_ASSERT_EQUAL_UINT32(5, Sum(3, 2));
}
但是這段代碼會產生上面提到的錯誤。
#include "unity.h"
#include "sum2nums.h"
#include "stm32f4xx.h"
void test_Sum(){
GPIOA->MODER = 1U;
TEST_ASSERT_EQUAL_UINT32(5, Sum(3, 2));
}
甚至有可能以這種方式對其進行測試,還是我必須使用 QEMU(以及如何在不使用 Eclipse 或任何其他 IDE 的情況下進行測試)? 請注意,Ceedling 使用 gcc,如果我使用 arm-none-eabi,它會生成十六進制文件,而我無法在我的 PC 上運行它。
如果我理解正確,這個測試框架只是試圖用主機 x86 C 編譯器編譯你的測試用例並直接運行它們。 這將適用於您的測試代碼不執行任何特定於硬件的操作,這就是為什么您的第一個測試用例很好的原因,但是一旦您的代碼嘗試接觸硬件,如果該硬件實際上不存在,它就會崩潰,如果您將其作為正常的 x86 Linux 進程運行,則顯然不是。
如果您需要運行訪問硬件的測試用例,那么您需要運行它們:
實際上在硬件上,例如通過將開發板插入您的 PC 並使用知道如何交叉編譯測試的測試框架,將生成的測試用例二進制文件復制到開發板,運行它並捕獲 output。
或在提供硬件 model 的仿真器或模擬器上。 QEMU 是這里的一種可能性,假設它具有您正在使用的板的 model 並且 model 對於您正在運行的任何東西都足夠好。 同樣,您的測試框架需要知道如何交叉編譯測試以及如何在模擬器上運行它並捕獲 output。
如果你想在 PC 上運行它,有一個簡單的解決方案。 您只需從 STM 庫中復制stm32fxxx.h
header,然后在該文件中用簡單變量替換所有地址。 例如:
volatile USART_TypeDef usart0_base;
#define USART0_BASE (&usart0_base) /**< USART0 base address */
現在,您更改主要的 header,其中添加了您的 CPU 特定包含,並添加了一個 MOCK 或一些定義,這會將地址為 header 的硬件與此 header 交換,您可以使用您的計算機 GCC 進行編譯,並在 linux 上運行(更快) . 這樣你基本上模擬了硬件並將其替換為簡單的 memory。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.