前言
在pmon中增加了新的源码文件后,链接时提示undefined reference to xxx。经过一番定位后,发现不是把新源文件放到pmon的一个子目录就可以,还需要修改配置。
这里的配置怎么理解呢?我的理解是pmon其实是一个小的操作系统,支持不只一种cpu,支持多种外设,需要通过配置文件来选择需要编译的文件。这和linux类似,在(make)编译linux之前,需要先执行make menuconfig。
Pmon的配置简介
百度文库里面有个文档——《pmon基础知识》讲得不错。这里把文档内容截图后贴在下面
配置文件位于各个目录下的conf目录内,在conf目录内的文件”file.xxx”里面增加一行
file <path to file> [modname]
这样pmon的配置工具就会把相应的源文件加入到Makefile中,并编译为.o文件,这样才能ld链接时才能顺利通过。
示例(新增一个源文件test_add_file.c)
新建源文件test_add_file.c
并放入目录“pmon根目录/Targets/LS1X/dev/”中,源文件内容如下
#include <stdio.h>
void test_add_file(void)
{
printf("[%s]: qin_wei_ben test add file to pmon\r\n", __FUNCTION__);
}
这里解释一下,为什么把测试用的源文件放目录“pmon根目录/Targets/LS1X/dev/”中。因为这个目录常用于放外设的驱动文件,比如gpio,串口,i2c等。
如果这个示例测试成功的话,可以参考这种方法把“龙芯1c库”的文件添加到pmon中,这样可以实现,在pmon的基础上,实现一些定制化的功能。
新建头文件test_add_file.h
并放入目录“pmon根目录/Targets/LS1X/include/”中,头文件内容如下
#ifndef TEST_ADD_FILE_H
#define TEST_ADD_FILE_H
void test_add_file(void);
#endif
修改配置
在文件“pmon根目录/Targets/LS1X/conf/files.LS1X”中添加如下配置信息,
file Targets/LS1X/dev/test_add_file.c
如下图所示
这样pmon的配置工具就会把源文件test_add_file.c写进Makefile中,并编译为test_add_file.o文件
如果没有增加这个配置,编译时会有如下提示
tgt_machdep.c:(.text+0x15e4): undefined reference to `test_add_file'
即,提示找不到相关函数的实现。进一步分析是,如果没加配置项,就不会编译源文件“test_add_file.c”,自然也就找不到函数test_add_file()
调用测试函数
在源文件“pmon根目录/Targets/LS1X/ls1x/tgt_machdep.c”中include头文件“test_add_file.h”,并在函数initmips()中调用测试函数test_add_file()
这里解释一下,为什么头文件是放在目录“pmon根目录/Targets/LS1X/include/”中,而include的时候却是target下。因为编译的时候,会自动把目录“pmon根目录/Targets/LS1X/include/”中的头文件拷贝到目录“pmon根目录/Targets/LS1X/compile/ls1c/target/”下。实际上文件夹“pmon根目录/Targets/LS1X/compile”会被自动创建,所有的编译其实就是在这个目录中进行的。
编译
cd zloader.ls1c/
make cfg && make tgt=rom
串口打印
感谢耐心阅读!