如何在晶心平台实作ROM patch
(4) patch的linker script,加入FUNC_PATH在jump_table之后。
FUNC_PATCH 0x510020 :
{
*(.FUNC_PATCH)
}
3. 如何除错
首先,将程序代码存放在IC的ROM及flash里。(本文为了示范,我们的做法是在AndeShape™ ADP-XC5的FPGA板上,用RAM模拟ROM及flash,分别将主程序和patch的bin文件restore到板子上。)
当gdb debug时,载入patch 的symbol。以下节录gdb指令。
core0(gdb) file mainprog.adx
core0(gdb) add-symbol-file patch.adx 0x500000 -s FUNC_TABLE 0x510000 -s FUNC_PATCH 0x510020
core0(gdb) set $pc=0x500000
core0(gdb) b main
Breakpoint 1 at 0x50010c: file ../main.c, line 20.
core0(gdb) c
Breakpoint 1, main () at ../main.c:20
20 printf("func1(30)=%d\n",jump_table.func_a(30));
core0(gdb) s
func1 (x=30) at ../main.c:28
28 return x*num1;
core0(gdb) n
29 }
core0(gdb) s
main () at ../main.c:21
21 printf("func2(30)=%d\n",jump_table.func_b(30));
core0(gdb) s
func2 (x=30) at ../patchprog.c:24
24 return x*num2*100;
core0(gdb)
上面过程中,先加载main的symbol,再加载patch的symbol及debug information。"add-symbol-file patch.adx 0x500000 -s FUNC_TABLE 0x510000 -s FUNC_PATCH 0x510020"是将patch section的symbol及debug information也载入gdb以debug。读者可以在gdb里,打"help add-symbol-file"查阅add-symbol-file的用法。
3.1 主程序patch后的执行结果
func1(30)=30
func2(30)=6000
func3(30)=90
4. 结语
目前晶心科技使用GNU的toolchain,其功能非常强大。读者可多动手试试不同的linker script写法,使得开发firmware更有弹性及效率。
(如果您对此文章有技术方面的疑问,欢迎来信至 hylai@andestech.com 与我们进行讨论)。
5. 参考数据
gnu linker ld manual
http://sourceware.org/binutils/docs-2.22/ld/index.html
6. 作者简历
赖歆雅,女,台湾省新竹县人。1977年出生,2002年毕业于台灣成功大学电机研究所VLSI/CAD组硕士班。
2002~2005年就读台灣成功大学电机研究所VLSI/CAD组博士班(肄业)。
2005~2010年任职于工业技术研究院,担任副工程师,负责Linux上的软件开发。
2010~2012年任职于晶心科技,担任技术经理,负责客户的技术支持。
关于晶心
为因应国内外嵌入式系统应用的快速成长,2005年晶心科技创立于新竹科学园区,致力于开发以32位处理器为核心的系统芯片设计平台(Processor-based SoC Platforms)。晶心科技是国内唯一结合软硬件平台及系统整合能力且专注于系统芯片核心开发的公司。
随着电子产业产品日趋多功能化,更多厂商开始对处理器及设计平台要求更佳的整合性、延展性、设计弹性,以及高效能、低成本与低功率。这样的复杂度已经超越传统供应厂商所能提供的解决方案。晶心科技考虑未来电子系统层面(ESL) 更广泛的设计要求,以创新的弹性配置平台(Configurable Platforms),搭配独特的软硬件智财,来满足未来客户对产品高质量及快速上市的需求。过去几年晶心在自有CPU平台架构下都处于耕耘市场的阶段,但是目前的CPU平台包括主流、低、中、高阶等级的N8、N9、N10、N12、N13及SN系列都已成熟到位,能满足客户各种应用面的全方位需求。
关于晶心科技提供之32位CPU IP及ESL系统开发工具,欢迎请参阅晶心科技网站。