Merge branch 'bugfix/unit-test-build-fix' into 'master'

unit-test-app: don’t include project.mk for ut- targets

See merge request idf/esp-idf!2619
This commit is contained in:
Ivan Grokhotkov 2018-07-24 20:48:12 +08:00
commit d50c03cc7d
8 changed files with 60 additions and 39 deletions

View file

@ -759,7 +759,7 @@ static void task_slave(void* arg)
do { do {
TEST_ESP_OK( spi_slave_transmit( context->spi, &t, portMAX_DELAY ) ); TEST_ESP_OK( spi_slave_transmit( context->spi, &t, portMAX_DELAY ) );
} while ( t.trans_len == 0 ); } while ( t.trans_len == 0 );
*(uint32_t*)recvbuf = t.trans_len; memcpy(recvbuf, &t.trans_len, sizeof(uint32_t));
*(uint8_t**)(recvbuf+4) = txdata.start; *(uint8_t**)(recvbuf+4) = txdata.start;
ESP_LOGI( SLAVE_TAG, "received: %d", t.trans_len ); ESP_LOGI( SLAVE_TAG, "received: %d", t.trans_len );
xRingbufferSend( ringbuf, recvbuf, 8+(t.trans_len+7)/8, portMAX_DELAY ); xRingbufferSend( ringbuf, recvbuf, 8+(t.trans_len+7)/8, portMAX_DELAY );

View file

@ -1,4 +1,5 @@
#include <string.h> #include <string.h>
#include <sys/param.h>
#include "unity.h" #include "unity.h"
#include "test_utils.h" // unity_send_signal #include "test_utils.h" // unity_send_signal
#include "driver/uart.h" // for the uart driver access #include "driver/uart.h" // for the uart driver access
@ -159,26 +160,19 @@ static uint16_t get_buffer_crc16( uint8_t * frame_ptr, uint16_t length )
static uint16_t buffer_fill_random(uint8_t *buffer, size_t length) static uint16_t buffer_fill_random(uint8_t *buffer, size_t length)
{ {
TEST_ASSERT( buffer != NULL); TEST_ASSERT( buffer != NULL);
uint8_t *byte_buffer = (uint8_t *)buffer; // Packet is too short
uint32_t random;
// Pcket is too short
if (length < 4) { if (length < 4) {
return 0; return 0;
} }
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i += 4) {
if (i == 0 || i % 4 == 0) { uint32_t random = esp_random();
// Generates random int32_t number memcpy(buffer + i, &random, MIN(length - i, 4));
random = esp_random();
}
// Place each byte of the uint32_t random number into buffer
byte_buffer[i] = random >> ((i % 4) * 8);
} }
// Get checksum of the buffer // Get checksum of the buffer
uint16_t crc = get_buffer_crc16((uint8_t*)byte_buffer, (length - 2)); uint16_t crc = get_buffer_crc16((uint8_t*)buffer, (length - 2));
// Apply checksum bytes into packet // Apply checksum bytes into packet
byte_buffer[length - 2] = (uint8_t)(crc & 0xFF); // Set Low byte CRC buffer[length - 2] = (uint8_t)(crc & 0xFF); // Set Low byte CRC
byte_buffer[length - 1] = (uint8_t)(crc >> 8); // Set High byte CRC buffer[length - 1] = (uint8_t)(crc >> 8); // Set High byte CRC
return crc; return crc;
} }
@ -241,7 +235,7 @@ static void rs485_slave()
if (len > 2) { if (len > 2) {
esp_err_t status = print_packet_data("Received ", slave_data, len); esp_err_t status = print_packet_data("Received ", slave_data, len);
// If recieved packet is correct then send it back // If received packet is correct then send it back
if (status == ESP_OK) { if (status == ESP_OK) {
uart_write_bytes(UART_NUM1, (char*)slave_data, len); uart_write_bytes(UART_NUM1, (char*)slave_data, len);
good_count++; good_count++;

View file

@ -49,7 +49,7 @@ extern SLIST_HEAD(registered_heap_ll, heap_t_) registered_heaps;
bool heap_caps_match(const heap_t *heap, uint32_t caps); bool heap_caps_match(const heap_t *heap, uint32_t caps);
/* return all possible capabilities (across all priorities) for a given heap */ /* return all possible capabilities (across all priorities) for a given heap */
inline static uint32_t get_all_caps(const heap_t *heap) inline static IRAM_ATTR uint32_t get_all_caps(const heap_t *heap)
{ {
if (heap->heap == NULL) { if (heap->heap == NULL) {
return 0; return 0;

View file

@ -9,6 +9,7 @@
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_spi_flash.h" #include "esp_spi_flash.h"
#include <stdlib.h> #include <stdlib.h>
#include <sys/param.h>
TEST_CASE("Capabilities allocator test", "[heap]") TEST_CASE("Capabilities allocator test", "[heap]")
{ {
@ -38,18 +39,24 @@ TEST_CASE("Capabilities allocator test", "[heap]")
TEST_ASSERT((((int)m1)&0xFF000000)==0x3F000000); TEST_ASSERT((((int)m1)&0xFF000000)==0x3F000000);
free(m1); free(m1);
printf("Freeing; allocating 10K of 32K-capable RAM\n"); //The goal here is to allocate from IRAM. Since there is no external IRAM (yet)
m1 = heap_caps_malloc(10*1024, MALLOC_CAP_32BIT); //the following gives size of IRAM-only (not D/IRAM) memory.
size_t free_iram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL) -
heap_caps_get_free_size(MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL);
size_t alloc32 = MIN(free_iram / 2, 10*1024);
printf("Freeing; allocating %u bytes of 32K-capable RAM\n", alloc32);
m1 = heap_caps_malloc(alloc32, MALLOC_CAP_32BIT);
printf("--> %p\n", m1); printf("--> %p\n", m1);
//Check that we got IRAM back
TEST_ASSERT((((int)m1)&0xFF000000)==0x40000000);
free8 = heap_caps_get_free_size(MALLOC_CAP_8BIT); free8 = heap_caps_get_free_size(MALLOC_CAP_8BIT);
free32 = heap_caps_get_free_size(MALLOC_CAP_32BIT); free32 = heap_caps_get_free_size(MALLOC_CAP_32BIT);
printf("Free 8bit-capable memory (after 32-bit): %dK, 32-bit capable memory %dK\n", free8, free32); printf("Free 8bit-capable memory (after 32-bit): %dK, 32-bit capable memory %dK\n", free8, free32);
//Only 32-bit should have gone down by 10K: 32-bit isn't necessarily 8bit capable //Only 32-bit should have gone down by alloc32: 32-bit isn't necessarily 8bit capable
TEST_ASSERT(free32<(free32start-10*1024)); TEST_ASSERT(free32<(free32start-alloc32));
TEST_ASSERT(free8==free8start); TEST_ASSERT(free8==free8start);
//Assume we got IRAM back
TEST_ASSERT((((int)m1)&0xFF000000)==0x40000000);
free(m1); free(m1);
printf("Allocating impossible caps\n"); printf("Allocating impossible caps\n");
m1= heap_caps_malloc(10*1024, MALLOC_CAP_8BIT|MALLOC_CAP_EXEC); m1= heap_caps_malloc(10*1024, MALLOC_CAP_8BIT|MALLOC_CAP_EXEC);
printf("--> %p\n", m1); printf("--> %p\n", m1);
@ -57,14 +64,15 @@ TEST_CASE("Capabilities allocator test", "[heap]")
printf("Testing changeover iram -> dram"); printf("Testing changeover iram -> dram");
// priorities will exhaust IRAM first, then start allocating from DRAM // priorities will exhaust IRAM first, then start allocating from DRAM
for (x=0; x<10; x++) { for (x=0; x<10; x++) {
m2[x]= heap_caps_malloc(10*1024, MALLOC_CAP_32BIT); m2[x]= heap_caps_malloc(alloc32, MALLOC_CAP_32BIT);
printf("--> %p\n", m2[x]); printf("--> %p\n", m2[x]);
} }
TEST_ASSERT((((int)m2[0])&0xFF000000)==0x40000000); TEST_ASSERT((((int)m2[0])&0xFF000000)==0x40000000);
TEST_ASSERT((((int)m2[9])&0xFF000000)==0x3F000000); TEST_ASSERT((((int)m2[9])&0xFF000000)==0x3F000000);
printf("Test if allocating executable code still gives IRAM, even with dedicated IRAM region depleted\n"); printf("Test if allocating executable code still gives IRAM, even with dedicated IRAM region depleted\n");
// (the allocation should come from D/IRAM) // (the allocation should come from D/IRAM)
m1= heap_caps_malloc(10*1024, MALLOC_CAP_EXEC); free_iram = heap_caps_get_free_size(MALLOC_CAP_EXEC);
m1= heap_caps_malloc(MIN(free_iram / 2, 10*1024), MALLOC_CAP_EXEC);
printf("--> %p\n", m1); printf("--> %p\n", m1);
TEST_ASSERT((((int)m1)&0xFF000000)==0x40000000); TEST_ASSERT((((int)m1)&0xFF000000)==0x40000000);
free(m1); free(m1);

View file

@ -11,7 +11,7 @@
/* declare the performance here */ /* declare the performance here */
#define IDF_PERFORMANCE_MAX_HTTPS_REQUEST_BIN_SIZE 800 #define IDF_PERFORMANCE_MAX_HTTPS_REQUEST_BIN_SIZE 800
#define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP 200 #define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP 200
#define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP_PSRAM 270 #define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP_PSRAM 300
#define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP_UNICORE 130 #define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP_UNICORE 130
#define IDF_PERFORMANCE_MAX_ESP_TIMER_GET_TIME_PER_CALL 1000 #define IDF_PERFORMANCE_MAX_ESP_TIMER_GET_TIME_PER_CALL 1000
#define IDF_PERFORMANCE_MAX_SPI_PER_TRANS_NO_POLLING 30 #define IDF_PERFORMANCE_MAX_SPI_PER_TRANS_NO_POLLING 30

View file

@ -124,15 +124,20 @@ static bool fn_in_rom(void *fn, const char *name)
TEST_CASE("check if ROM or Flash is used for functions", "[newlib]") TEST_CASE("check if ROM or Flash is used for functions", "[newlib]")
{ {
#ifdef CONFIG_NEWLIB_NANO_FORMAT #if defined(CONFIG_NEWLIB_NANO_FORMAT) && !defined(CONFIG_SPIRAM_SUPPORT)
TEST_ASSERT(fn_in_rom(printf, "printf")); TEST_ASSERT(fn_in_rom(printf, "printf"));
TEST_ASSERT(fn_in_rom(sscanf, "sscanf")); TEST_ASSERT(fn_in_rom(sscanf, "sscanf"));
#else #else
TEST_ASSERT_FALSE(fn_in_rom(printf, "printf")); TEST_ASSERT_FALSE(fn_in_rom(printf, "printf"));
TEST_ASSERT_FALSE(fn_in_rom(sscanf, "sscanf")); TEST_ASSERT_FALSE(fn_in_rom(sscanf, "sscanf"));
#endif #endif
#if !defined(CONFIG_SPIRAM_SUPPORT)
TEST_ASSERT(fn_in_rom(atoi, "atoi")); TEST_ASSERT(fn_in_rom(atoi, "atoi"));
TEST_ASSERT(fn_in_rom(strtol, "strtol")); TEST_ASSERT(fn_in_rom(strtol, "strtol"));
#else
TEST_ASSERT_FALSE(fn_in_rom(atoi, "atoi"));
TEST_ASSERT_FALSE(fn_in_rom(strtol, "strtol"));
#endif
} }
#ifndef CONFIG_NEWLIB_NANO_FORMAT #ifndef CONFIG_NEWLIB_NANO_FORMAT

View file

@ -271,7 +271,7 @@ TEST_CASE("ulp power consumption in deep sleep", "[ulp][ignore]")
{ {
assert(CONFIG_ULP_COPROC_RESERVE_MEM >= 4 && "this test needs ULP_COPROC_RESERVE_MEM option set in menuconfig"); assert(CONFIG_ULP_COPROC_RESERVE_MEM >= 4 && "this test needs ULP_COPROC_RESERVE_MEM option set in menuconfig");
ulp_insn_t insn = I_HALT(); ulp_insn_t insn = I_HALT();
RTC_SLOW_MEM[0] = *(uint32_t*) &insn; memcpy(&RTC_SLOW_MEM[0], &insn, sizeof(insn));
REG_WRITE(SENS_ULP_CP_SLEEP_CYC0_REG, 0x8000); REG_WRITE(SENS_ULP_CP_SLEEP_CYC0_REG, 0x8000);

View file

@ -5,9 +5,10 @@
PROJECT_NAME := unit-test-app PROJECT_NAME := unit-test-app
include $(IDF_PATH)/make/project.mk
ifeq ($(MAKELEVEL),0) ifeq ($(MAKELEVEL),0)
# Set default target
all:
# Define helper targets only when not recursing # Define helper targets only when not recursing
# List of unit-test-app configurations. # List of unit-test-app configurations.
@ -22,8 +23,9 @@ CONFIG_CLEAN_TARGETS := $(addprefix ut-clean-,$(CONFIG_NAMES))
CONFIG_APPLY_TARGETS := $(addprefix ut-apply-config-,$(CONFIG_NAMES)) CONFIG_APPLY_TARGETS := $(addprefix ut-apply-config-,$(CONFIG_NAMES))
# Build (intermediate) and output (artifact) directories # Build (intermediate) and output (artifact) directories
BUILDS_DIR := $(PROJECT_PATH)/builds PROJECT_DIR := $(abspath $(dir $(firstword $(MAKEFILE_LIST))))
BINARIES_DIR := $(PROJECT_PATH)/output BUILDS_DIR := $(PROJECT_DIR)/builds
BINARIES_DIR := $(PROJECT_DIR)/output
# This generates per-config targets (clean, build, apply-config). # This generates per-config targets (clean, build, apply-config).
define GenerateConfigTargets define GenerateConfigTargets
@ -57,14 +59,14 @@ $(BINARIES_DIR)/%/$(PROJECT_NAME).bin: configs/%
mkdir -p $(BINARIES_DIR)/$*/bootloader mkdir -p $(BINARIES_DIR)/$*/bootloader
mkdir -p $(BUILDS_DIR)/$* mkdir -p $(BUILDS_DIR)/$*
# Prepare configuration: top-level sdkconfig.defaults file plus the current configuration (configs/$*) # Prepare configuration: top-level sdkconfig.defaults file plus the current configuration (configs/$*)
$(summary) CONFIG $(BUILDS_DIR)/$*/sdkconfig echo CONFIG $(BUILDS_DIR)/$*/sdkconfig
rm -f $(BUILDS_DIR)/$*/sdkconfig rm -f $(BUILDS_DIR)/$*/sdkconfig
cat sdkconfig.defaults > $(BUILDS_DIR)/$*/sdkconfig.defaults cat sdkconfig.defaults > $(BUILDS_DIR)/$*/sdkconfig.defaults
echo "" >> $(BUILDS_DIR)/$*/sdkconfig.defaults # in case there is no trailing newline in sdkconfig.defaults echo "" >> $(BUILDS_DIR)/$*/sdkconfig.defaults # in case there is no trailing newline in sdkconfig.defaults
cat configs/$* >> $(BUILDS_DIR)/$*/sdkconfig.defaults cat configs/$* >> $(BUILDS_DIR)/$*/sdkconfig.defaults
# Build, tweaking paths to sdkconfig and sdkconfig.defaults # Build, tweaking paths to sdkconfig and sdkconfig.defaults
$(summary) BUILD_CONFIG $(BUILDS_DIR)/$* echo BUILD_CONFIG $(BUILDS_DIR)/$*
# 'TEST_COMPONENTS=names' option can be added to configs/$* to limit the set # 'TEST_COMPONENTS=names' option can be added to configs/$* to limit the set
# of tests to build for given configuration. # of tests to build for given configuration.
# Build all tests if this option is not present. # Build all tests if this option is not present.
@ -80,7 +82,7 @@ $(BINARIES_DIR)/%/$(PROJECT_NAME).bin: configs/%
TEST_EXCLUDE_COMPONENTS="$${test_exclude_components}" \ TEST_EXCLUDE_COMPONENTS="$${test_exclude_components}" \
TESTS_ALL=$${tests_all} \ TESTS_ALL=$${tests_all} \
EXCLUDE_COMPONENTS="$${exclude_components}" EXCLUDE_COMPONENTS="$${exclude_components}"
$(MAKE) print_flash_cmd \ $(MAKE) --silent print_flash_cmd \
BUILD_DIR_BASE=$(BUILDS_DIR)/$* \ BUILD_DIR_BASE=$(BUILDS_DIR)/$* \
SDKCONFIG=$(BUILDS_DIR)/$*/sdkconfig \ SDKCONFIG=$(BUILDS_DIR)/$*/sdkconfig \
| sed -e 's:'$(BUILDS_DIR)/$*/'::g' \ | sed -e 's:'$(BUILDS_DIR)/$*/'::g' \
@ -115,17 +117,29 @@ ut-help:
help: ut-help help: ut-help
.PHONY: ut-build-all-configs ut-clean-all-configs \ LOCAL_TARGETS := ut-build-all-configs ut-clean-all-configs \
$(CONFIG_BUILD_TARGETS) $(CONFIG_CLEAN_TARGETS) $(CONFIG_APPLY_TARGETS) \ $(CONFIG_BUILD_TARGETS) $(CONFIG_CLEAN_TARGETS) \
ut-help ut-help
.PHONY: $(LOCAL_TARGETS)
NON_INTERACTIVE_TARGET += ut-apply-config-% ut-clean-% ut-build-% \ NON_INTERACTIVE_TARGET += ut-apply-config-% ut-clean-% ut-build-% \
ut-build-all-configs ut-clean-all-configs ut-build-all-configs ut-clean-all-configs
else # MAKELEVEL == 0 endif # MAKELEVEL == 0
# When targets defined in this makefile are built, don't need to include the main project makefile.
# This prevents some variables which depend on build directory from being set erroneously.
ifeq ($(filter $(LOCAL_TARGETS),$(MAKECMDGOALS)),)
include $(IDF_PATH)/make/project.mk
endif
# If recursing, print the actual list of tests being built # If recursing, print the actual list of tests being built
ifneq ($(MAKELEVEL),0)
$(info TESTS $(foreach comp,$(TEST_COMPONENT_NAMES),$(patsubst %_test,%,$(comp)))) $(info TESTS $(foreach comp,$(TEST_COMPONENT_NAMES),$(patsubst %_test,%,$(comp))))
endif # MAKELEVEL == 0 endif # MAKELEVEL != 0