IMX6ULL裸机启动,IMX6ULL运行freeRtos

IMX6ULL裸机启动,IMX6ULL运行freeRtos

裸机启动部分

IMX6ULL裸机启动,IMX6ULL运行freeRtos_第1张图片
imx6ull中根据运行代码位置的不同RAM/flash/SD卡,上电会先运行片上ROM中的代码,搬运的数据大小是不同的,代码也不是存储在0地址处的。如下图,比如从sd中运行代码,代码IVToffset大小1k,initloadSize为4k。IMX6ULL裸机启动,IMX6ULL运行freeRtos_第2张图片
实质上应用程序前红色框中的大小有3k,可以配置启动信息,入口地址,初始化设备,基本的时钟,DDR要先初始化才能使用吧。具体的可以参考其他资料如百问网的imx6ull手册
在这里插入图片描述
韦老师的裸机代码中,写好的程序是调用mkimage给app程序加上特有的头部信息,配合其开发的烧录工具100ask_imx6ull_flashing_tool可以下载到ram运行(*.imx文件)。如果想下载sd中,需要在imx文件前面加上1k的偏移(image vector table offset)

mkimage -n ./tools/imximage.cfg.cfgtmp -T imximage -e 0x80200000 -d led.bin led.imx
// -e 0x80200000程序会被搬运到的位置

其他的开发板如,原子的imxdownload工具中直接固定了加载地址为0X87800000,链接脚本中也是这个地址,如不地址不相同,就会牵扯到代码重定位的问题。
在这里插入图片描述在这里插入图片描述

但也有可能有人设置的就是不一样的地址,照样能跑下去,这就要看start.s中的跳转指令是

	ldr sp, =main		/* 跳转到main函数 		 */
	b main				/* 跳转到main函数 		 */

链接地址和加载地址不一样的情况:
如果是第一行的话就无法运行,地址相关代码
如果第二行的话就代码可以部分运行,比如打印定义好的全局变量就不正常了,data区没有搬运到相应的链接地址去。

IMX6ULL运行freeRtos

imx6ull有官网的skd,里面已经有一些例子。
第一步:
SDK_2.2_MCIM6ULL/boards/evkmcimx6ull/demo_apps/hello_world/armgcc中直接运行 ./build_ddr_debug.sh

SDK_2.2_MCIM6ULL/boards/evkmcimx6ull/demo_apps/hello_world/armgcc# ./build_ddr_debug.sh

第二步:

mkimage -n ./tools/imximage.cfg.cfgtmp -T imximage -e 0x80002000 -d led.bin led.imx

注意:-e 地址 为 0x80002000

第三步:
利用100ask_imx6ull_flashing_tool下载到imx6ull上面运行就会看到串口打印的

hello world.

FreeRtos

买到板子之后不久就一直想在imx6ULL上面跑rtos,结果也没找到啥教程,有人说cortexa7的可以参看a9的移植,无奈还是懵,后来想看看freertos源码之后在动手,结果发现简单看了源码还是菜到没头绪。
中间玩玩裸机程序,突然有两天就想研究一下,imx上程序从编译好到下载到板子上是怎么运行的,为啥我编译的sdk代码不可以用,后面就发现rtos的demo代码可能启动位置不对,根据连接脚本中的信息链接地址为0x80002000
SDK_2.2_MCIM6ULL/boards/evkmcimx6ull/rtos_examples 目录中有些例子,只要编译后,加上imx头部信息,就可以愉快的在imx6ull上面跑freertos了,
后续看看我的板子怎么能在freertos基础上跑lwip

代码重定位

关于代码重定位。

你可能感兴趣的:(单片机,freertos,imx,c语言,arm开发)