MTK平台动态加载功能实现
来源:互联网 发布:主宰西游进阶数据 编辑:程序博客网 时间:2024/04/29 11:44
[腾讯qq空间转载]
目的:
让MTK操作系统真正成为一个像WindowsMobile一样完全开放的智能操作平台,
可动态加载一个或多个独立运行程序。
软硬件环境:
OS: Nucleus
CPU:MT6225
ENV:ADS1.2
过程实现:
从理论上来说,动态加载很简单,只需要把当前的PC指针指向下一句执行的语句即可。也就是使用如下的语句就可以实现(pAdress为独立运行文件的存放地址,此地址是可浮动的):
((void(*)())pAdress)();
下面说一下ADS编译为二进制可执行文件的问题,使用编译器如果一开始把所有的数据都放好,这样包括全局变量和静态变量,以及函数的执行地址等,都已在LINK的时候根据指定规则确定实际的运行地址,也就是说所有的函数的实际运行地址在LINK的时候已经确定。这样对于动态运行来说是不可行的,因为既然要动态加载,就需要所有地址都是静态的,因为每次对于读入内存的数据,起始地址是不缺定的,因此不能再LINK时把所有的地址固定死。
解决这个问题有两种方式,一种是在scatter loader中把程序的可执行地址固定好,在LINK时不LINK实际的数据,而在系统启动的时候,把这部分可执行文件拷贝的固定的地址,这样可以作为一个整体运行。但是这种方式由问题,就是应用的大小什么的都是固定死的,不能太灵活,不能根据应用实际调整。
这里使用另外一种方式,选择程序不在LINK的时候把所有的地址固定死,而是使用相对独立的函数调用方式。其实ADS提供了把函数编译为独立地址的方式,
COMPILER使用如下的参数/ropi/rwpi
LINK使用如下的参数-rwpi –ropi
就可以把编译的程序做到运行时地址是独立的。
上面只是实现了独立文件运行时的地址无关,还有一个独立文件入口地址可浮动的功能实现问题,以实现将手机作为优盘直接拷贝独立运行文件进行功能扩充的目的。
在Ads1.2中,可通过在imageentry point框里添加主函数名的方式实现(注意:主函数不可以用main,否则会有报错信息)。
上面的文章解决了动态编译和加载的问题,下面说一下动态应用的问题。如果要使一个应用有价值,必然需要提供本地的功能调用,而且对于手机来说,系统已经基本上实现了大多数的功能,如果在动态应用中再重复实现一些功能,可以说既浪费了空间,又浪费了时间。而且对于硬件相关的功能,必须通过本地调用来进行,这样就需要如何把本地调用传入动态应用中。如上文所说,本地的调用地址都是在LINK的时候确定的没有办法直接在动态应用中使用,这样需要在运行时把本地调用传入动态应用,由于动态应用的入口还有好几个参数可以使用,这样就可以构造一张系统调用的表,在运行的时候传入动态应用,这样可以通过表来调用系统功能,这样就解决了系统本地调用的问题。
- MTK平台动态加载功能实现
- MTK平台动态加载功能实现
- MTK动态加载,OTA实现。
- MTK动态加载尝试
- Trace32 加载MTK平台 SYS_MINI_RDUMP
- MTK 平台手势唤醒功能
- MTK平台相关功能支持
- MTK平台用Socket实现
- MTK功能机平台后台发送彩信
- MTK平台Sub Camera支持AF功能
- MTK功能机平台抓log
- MTK功能机平台抓log
- MTK平台上电话黑名单功能总结
- MTK平台CPU/GPU动态调频的实现之PerfService的源码分析
- MTK功能机实现sim卡热插拔功能
- C++Linux平台动态加载类库实现类
- mtk功能机平台触屏校准功能阅读笔记
- 封装实现JavaScript 文件的动态加载功能
- Mac OS X Graphics Stack 本文介绍了 Mac OS X 的图形栈,分析了它的原理和体系结构。
- POJ 2632 Crashing Robots 模拟的方法
- Linux I2C核心、总线与设备驱动
- VS2010中的计算代码度量值
- 数据库测试工具dbmonster使用:int 型主键,外键,varchar型数据生成
- MTK平台动态加载功能实现
- php防注入
- lambda表达式的解析(五) Lambda表达式与闭包类型
- TCP TIME_WAIT状态
- PHP魔术常量:__LINE__ __FILE__ __CLASS__
- MONGODB安装过程
- sql 2008 删除日志
- php输出时间与当前时间不一致(时间函数出错解决办法)
- Redis(超高性能数据库)持久化Key-Value数据存储