报错内容:
Module: can't find led1_on in kernel symbol table
Module: can't find rt_thread_delay in kernel symbol table
平台是STM32F767正点原子阿波罗,IAR编译主程序,icf文件已经添加keep { section RTMSymTab };
编译产生的rtthread.map文件可以找到
__rtmsym_rt_thread_delay
0x0804116c 0x8 Data Gb thread.o [1]
__rtmsym_rt_thread_delay_name
0x08049cec 0x10 Data Gb thread.o [1]
__rtmsym_led1_off 0x08040a94 0x8 Data Gb drv_led.o [1]
__rtmsym_led1_off_name 0x0804a08c 0xc Data Gb drv_led.o [1]
__rtmsym_led1_on 0x08040a8c 0x8 Data Gb drv_led.o [1]
__rtmsym_led1_on_name 0x0804a6d0 0x8 Data Gb drv_led.o [1]
RTMSymTab$$Base 0x0804090c -- Gb - Linker created -
RTMSymTab$$Limit 0x080411d4 -- Gb - Linker created -
模块的rtconfig.py如下
import os
cwd = os.path.split(os.path.realpath(__file__))[0]
# RT-Thread root directory
RTT_ROOT = 'D:/rt-thread_dev/rt-thread'
BSP_ROOT = 'D:/rt-thread_dev/rt-thread/bsp/stm32f767-apollo'
# toolchains
EXEC_PATH = 'C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q3/bin'
if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT')
if os.getenv('BSP_ROOT'): BSP_ROOT = os.getenv('BSP_ROOT')
if os.getenv('RTT_EXEC_PATH'): EXEC_PATH = os.getenv('RTT_EXEC_PATH')
PLATFORM = 'gcc'
PREFIX = 'arm-none-eabi-'
CC = PREFIX + 'gcc'
CXX = PREFIX + 'g++'
AS = PREFIX + 'gcc'
AR = PREFIX + 'ar'
LINK = PREFIX + 'gcc'
TARGET_EXT = 'mo'
SIZE = PREFIX + 'size'
OBJDUMP = PREFIX + 'objdump'
OBJCPY = PREFIX + 'objcopy'
DEVICE = ' -mcpu=cortex-m7'
CFLAGS = DEVICE + ' -mthumb -mlong-calls -O0 -fPIC -fno-exceptions'
AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp'
LFLAGS = DEVICE + ' -mthumb -Wl,-z,max-page-size=0x4 -shared -fPIC -e main -nostdlib'
CPATH = ''
LPATH = ''
sconstruct 文件:
import os
import sys
import rtconfig
sconstruct = File('SConstruct')
fn = sconstruct.rfile()
name = fn.name
building_dir = os.path.dirname(fn.abspath)
program_dir = '../bin'
from rtconfig import RTT_ROOT
from rtconfig import BSP_ROOT
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools'), BSP_ROOT]
from building import *
from rtua import GetCPPPATH
from rtua import GetCPPDEFINES
Export('RTT_ROOT')
Export('BSP_ROOT')
# add target option
AddOption('--app',
dest='app',
nargs=1, type='string',
action='store',
metavar='DIR',
help='installation prefix')
# add target option
AddOption('--type',
dest='type',
nargs=1, type='string',
action='store',
metavar='DIR',
help='installation prefix')
if GetOption('type') == 'ext':
linkflags = rtconfig.LFLAGS + ' -e 0'
else:
linkflags = rtconfig.LFLAGS + ' -e main'
CPPPATH = GetCPPPATH(BSP_ROOT, RTT_ROOT)
env = Environment(tools = ['mingw'],
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
CXX = rtconfig.CXX, AR = rtconfig.AR, ARFLAGS = '-rc',
LINK = rtconfig.LINK, LINKFLAGS = linkflags,
CPPPATH = CPPPATH)
env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
PrepareModuleBuilding(env, RTT_ROOT, BSP_ROOT)
app = GetOption('app')
if app:
objs = SConscript(os.path.join(app, 'D:/rt-thread_dev/rt-thread/examples/module/basicapp/SConscript'))
TARGET = os.path.join(app , app + '.' + rtconfig.TARGET_EXT)
# build program
target = env.Program(TARGET, objs)
env.Command("$TARGET", target, action = Copy(program_dir, TARGET))
确定rt_system_module_init函数运行到了下面代码:
#elif defined (__IAR_SYSTEMS_ICC__)
_rt_module_symtab_begin = __section_begin("RTMSymTab");
_rt_module_symtab_end = __section_begin("RTMSymTab");
#endif
rtua.y是自动生成的。
确定报错函数是这个
static struct rt_module *_load_shared_object(const char *name,
void *module_ptr)
求教下一步怎么查?