kopia lustrzana https://github.com/espressif/esp-idf
ldgen: add test app for placement sanity check
rodzic
7f18c948dc
commit
23590374b5
|
@ -0,0 +1,15 @@
|
|||
# The following lines of boilerplate have to be in your project's
|
||||
# CMakeLists in this exact order for cmake to work correctly
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
project(ldgen_test)
|
||||
|
||||
idf_build_get_property(python PYTHON)
|
||||
idf_build_get_property(elf EXECUTABLE)
|
||||
|
||||
add_custom_command(
|
||||
TARGET ${elf}
|
||||
POST_BUILD
|
||||
COMMAND ${python} ${CMAKE_CURRENT_LIST_DIR}/check_placements.py ${CMAKE_OBJDUMP} $<TARGET_FILE:${elf}>
|
||||
)
|
|
@ -0,0 +1,5 @@
|
|||
Runs a build test to check ldgen places libraries, objects and symbols
|
||||
correctly as specified in the linker fragments. Specifically, this app
|
||||
tests the placement for the main component, as specified in `main/linker.lf`
|
||||
The Python script that performs the checks, `check_placements.py`, automatically
|
||||
runs after the app is built.
|
|
@ -0,0 +1,64 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2020 Espressif Systems (Shanghai) PTE LTD
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
# Check placements in this test app for main
|
||||
# specified in main/linker.lf
|
||||
|
||||
import argparse
|
||||
import subprocess
|
||||
|
||||
from pyparsing import LineEnd, Literal, ParseException, SkipTo, Word, alphanums, hexnums
|
||||
|
||||
argparser = argparse.ArgumentParser()
|
||||
|
||||
argparser.add_argument('objdump')
|
||||
argparser.add_argument('elf')
|
||||
|
||||
args = argparser.parse_args()
|
||||
|
||||
contents = subprocess.check_output([args.objdump, '-t', args.elf]).decode()
|
||||
|
||||
|
||||
def check_location(symbol, expected):
|
||||
pattern = Word(alphanums + '._').setResultsName('actual') + Word(hexnums) + Literal(symbol) + LineEnd()
|
||||
pattern = SkipTo(pattern) + pattern
|
||||
|
||||
try:
|
||||
results = pattern.parseString(contents)
|
||||
except ParseException:
|
||||
print("check placement fail: '%s' was not found" % (symbol))
|
||||
exit(1)
|
||||
|
||||
if results.actual != expected:
|
||||
print("check placement fail: '%s' was placed in '%s', not in '%s'" % (symbol, results.actual, expected))
|
||||
exit(1)
|
||||
|
||||
print("check placement pass: '%s' was successfully placed in '%s'" % (symbol, results.actual))
|
||||
|
||||
|
||||
# src1:func1 (noflash) - explicit mapping for func2 using 'rtc' scheme
|
||||
check_location('func1', '.iram0.text')
|
||||
|
||||
# src1:func2 (rtc) - explicit mapping for func2 using 'rtc' scheme
|
||||
check_location('func2', '.rtc.text')
|
||||
|
||||
# src1 (default) - only func3 in src1 remains that has not been
|
||||
# mapped using a different scheme
|
||||
check_location('func3', '.flash.text')
|
||||
|
||||
# * (noflash) - no explicit mapping for src2
|
||||
check_location('func4', '.iram0.text')
|
|
@ -0,0 +1,3 @@
|
|||
idf_component_register(SRCS "src1.c" "src2.c" "test_main.c"
|
||||
INCLUDE_DIRS "."
|
||||
LDFRAGMENTS "linker.lf")
|
|
@ -0,0 +1,7 @@
|
|||
[mapping:main]
|
||||
archive: libmain.a
|
||||
entries:
|
||||
* (noflash)
|
||||
src1 (default)
|
||||
src1:func1 (noflash)
|
||||
src1:func2 (rtc)
|
|
@ -0,0 +1,16 @@
|
|||
#include <stdio.h>
|
||||
|
||||
void func1(void)
|
||||
{
|
||||
printf("Hello from func1!\n");
|
||||
}
|
||||
|
||||
void func2(void)
|
||||
{
|
||||
printf("Hello from func2!\n");
|
||||
}
|
||||
|
||||
void func3(void)
|
||||
{
|
||||
printf("Hello from func3!\n");
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
#include <stdio.h>
|
||||
|
||||
void func4(void)
|
||||
{
|
||||
printf("Hello from func4!\n");
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
|
||||
extern void func1(void);
|
||||
extern void func2(void);
|
||||
extern void func3(void);
|
||||
extern void func4(void);
|
||||
|
||||
|
||||
void app_main(void)
|
||||
{
|
||||
func1();
|
||||
func2();
|
||||
func3();
|
||||
func4();
|
||||
}
|
Ładowanie…
Reference in New Issue