搜索
bottom↓
回复: 47
打印 上一主题 下一主题

rtos下如何动态加载任务

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2015-1-20 14:43:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在用的iap功能,其实就是个boot功能,导致这个boot程序内容无法重用,如果boot程序要支持各种高级协议,如tcpip、usb等,占用程序空间就会较大

这样在stm32这样的小rom单片机上就不是很适合,如果我们能够让boot成为全功能部件,就像Windows一样,所有的应用程序就是个动态加载程序

如果能够将rtos打造成类似于windows os这样,支持动态加载程序的话,应用程序区升级就方便多了,修改也非常容易

可能有人说需要mmu支持,其实在stm32里,使用位置无关代码或者就算是位置相关的,只要指定了rom区域,照样也没有问题

我们可以使用svc方式调用os函数,这样的话应用程序区甚至不会出现boot程序区的函数标号

唯一的不便是访问os区全局变量,不过可以用函数接口解决,看上去思路很清晰啊  

貌似rt-thread已经支持了任务动态加载,不知道是不是真的

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

2
发表于 2015-1-20 20:25:04 | 只看该作者
rt里面已经有这样的例子了,可以实现动态加载

出0入0汤圆

3
 楼主| 发表于 2015-1-20 21:27:08 | 只看该作者
s200661524 发表于 2015-1-20 20:25
rt里面已经有这样的例子了,可以实现动态加载

是在rtt公开下载那个文件里吗,我去研究研究

出0入0汤圆

4
发表于 2015-2-6 23:09:42 来自手机 | 只看该作者
是的,模拟器上也可以跑,其实现在处理器性能已经很强大了,要是对速度没什么要求,完全可以用脚本语言去做,lua elua都有人在搞

出0入0汤圆

5
 楼主| 发表于 2015-2-7 07:48:00 | 只看该作者
s200661524 发表于 2015-2-6 23:09
是的,模拟器上也可以跑,其实现在处理器性能已经很强大了,要是对速度没什么要求,完全可以用脚本语言去做 ...

有需求时再搞这个脚本吧,不过rtx本身就是用svc运行系统函数,改造起来还是挺麻烦的

出0入0汤圆

6
发表于 2015-2-13 14:25:07 | 只看该作者
myxiaonia 发表于 2015-2-7 07:48
有需求时再搞这个脚本吧,不过rtx本身就是用svc运行系统函数,改造起来还是挺麻烦的 ...

"rtx本身就是用svc运行系统函数",不是通过svc调用来实现的,是对应用程序与系统进行动态链接实现的

出0入0汤圆

7
 楼主| 发表于 2015-2-13 16:59:15 | 只看该作者
s200661524 发表于 2015-2-13 14:25
"rtx本身就是用svc运行系统函数",不是通过svc调用来实现的,是对应用程序与系统进行动态链接实现的 ...

没明白你的意思


我在rtt官网问了这个问题,看他们好像是对elf文件格式进行动态加载,而不是bin文件动态加载。。。
具体也没搞懂,用了很高级的特性,对elf中引用的系统标号进行动态替换然后在sram中运行

出0入0汤圆

8
发表于 2015-2-14 20:54:44 | 只看该作者
一直都想实现这样的功能,但没能成功,期待楼主分享

出0入0汤圆

9
发表于 2015-3-24 09:19:48 | 只看该作者
楼主有没有研究出办法啊??

出0入0汤圆

10
 楼主| 发表于 2015-3-25 07:56:00 | 只看该作者
本帖最后由 myxiaonia 于 2015-3-26 11:34 编辑
soos 发表于 2015-3-24 09:19
楼主有没有研究出办法啊??


恩 有个思路 rtx使用svc 0号中断系统调用,r12传递真实函数,我们可以强制要求r12传递值作为rtx内核函数的索引,这样的话我们只需要把所有rtx内核函数放到一张表中,通过索引来获得对应函数即可
这样rtx中前缀为os_的就可以搞定了,还有个isr_前缀的不知道怎么搞,你有思路吗


///////////////////////////////////////////////////////////////////////////////////////////////////////
为了兼容rtx原来的调用,不修改svc0号中断用法,而是使用svc1中断以查表法实现svc0的os_前缀内核函数,isr_则可以使用svc2的方式调用,isr_内核函数其实是通过pendsv实现的,我们就用svc间接来完成,同样只需要将所有isr_内核函数放到表中,做成索引
并且可以像rtx处理其他svc的方法调用svc2即可,即svc2调用后不需要处理任务切换

总结下,在rtx中,隐藏rtos内核函数具体实现,并在app程序中可以任意调用的方法:保留svc 0,1,2这三个中断号作为系统使用的中断号,其中svc0是rtx默认使用的,svc1是间接调用os_内核函数,svc2是间接调用isr_内核函数的


//////////////////////////////////////////////////////////////
遇上个麻烦事,nvic设置偏移的话,app程序中怎么兼容boot区的几个中断svc,pendsv和systick,不设置偏移的话,其他中断怎么调用

出10入0汤圆

11
发表于 2015-3-25 08:31:52 来自手机 | 只看该作者
太高级了,没搞过,帮顶!

出0入0汤圆

12
 楼主| 发表于 2015-3-25 08:36:55 | 只看该作者
dgtg 发表于 2015-3-25 08:31
太高级了,没搞过,帮顶!

其实这个问题类似于 如何共用iap程序区的函数,这个问题坛子里早就有人问过了

出0入0汤圆

13
发表于 2015-3-25 15:15:12 | 只看该作者
操作系统中线程是可以动态的。如果程序也是动态的(安装和卸载),这个不简单吧?可以参考windows的DLL

出0入0汤圆

14
 楼主| 发表于 2015-3-25 15:17:10 | 只看该作者
zhenghe 发表于 2015-3-25 15:15
操作系统中线程是可以动态的。如果程序也是动态的(安装和卸载),这个不简单吧?可以参考windows的DLL ...

一般说rtos的任务的话,都是指的线程哦

出0入0汤圆

15
发表于 2015-3-27 22:33:47 | 只看该作者

把应用程序编译成可重定位的elf格式文件,操作系统加载elf格式文件并经链接处理后,生成一个可执行的对象文件,其中的链接处理包括对应用程序中对操作系统函数调用的重新连接

出0入0汤圆

16
 楼主| 发表于 2015-3-28 07:35:42 | 只看该作者
s200661524 发表于 2015-3-27 22:33
把应用程序编译成可重定位的elf格式文件,操作系统加载elf格式文件并经链接处理后,生成一个可执行的对象 ...

我在rtt官网上问问了,确实如你所说,是对elf文件进行修改,而且还要在ram中运行。。。和我现在说的情况还是有不同的

出0入0汤圆

17
发表于 2015-3-28 09:59:02 来自手机 | 只看该作者
弱弱问  这个情况是两个普通工程么 还是说应用程序不是我们平常的普通mdk工程,只是生成一段代码片段 两个工程堆栈 内存划分 分配管理什么的是什么情况  

出0入0汤圆

18
发表于 2015-3-28 10:02:50 来自手机 | 只看该作者
是不是在有mmu时候完全没这些事?地址可以各自重映射成0?

出0入0汤圆

19
 楼主| 发表于 2015-3-28 11:53:48 | 只看该作者
huangqi412 发表于 2015-3-28 09:59
弱弱问  这个情况是两个普通工程么 还是说应用程序不是我们平常的普通mdk工程,只是生成一段代码片段 两个 ...

是个独立的程序,可能中断函数不好处理,如何重定向原来的3个中断函数,是个问题,看来只能指定函数地址了,然后在app程序中使用其作为中断向量

出0入0汤圆

20
发表于 2015-3-28 12:09:41 来自手机 | 只看该作者
myxiaonia 发表于 2015-3-28 11:53
是个独立的程序,可能中断函数不好处理,如何重定向原来的3个中断函数,是个问题,看来只能指定函数地址 ...

app退出后要能返回rtos这才好玩

出0入93汤圆

21
发表于 2015-3-28 13:00:00 | 只看该作者
这玩意儿我早就实现过,说穿了非常简单,一层窗户纸而已,捅破了也就那么回事,但是就是没有人捅破。

相互调用:函数指针啊,相当于Windows中的导入导出表。
中断:OS直接将中断搞到RAM中去,App改写这个RAM里的值就OK了
MMU:这玩意有没有都没关系,有的话硬件映射,没有的话软件重定位


我给个bin,有函数的相互调用,有重定位,就是不提供Code:
我用的是STM32F030编译的,自己测试有效。
App.bin是主程序,对应于LZ所说的RTOS。导出了一个函数:端口取反,必须烧写到0x00000000或0x08000000地址。必须烧写。
PlugIn1.bin、PlugIn2.bin分别为两个插件程序,对应于LZ所说的任务。都导入了一个函数:端口取反。随意烧写到1K边界对齐的任意位置就行,只是不要互相覆盖就行。比如烧到0x08000400、0x08000800、0x08000C00、0x08001000、...   动态加载嘛,烧写了哪个就具有哪个功能。烧写了PlugIn1.bin则PA0会输出方波,烧写了PlugIn2.bin则PA1会输出方波。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出100入85汤圆

22
发表于 2015-3-28 13:15:20 | 只看该作者
takashiki 发表于 2015-3-28 13:00
这玩意儿我早就实现过,说穿了非常简单,一层窗户纸而已,捅破了也就那么回事,但是就是没有人捅破。

相互 ...

既然都快捅破了,你就捅破吧
给个简单例子的代码。

出0入0汤圆

23
发表于 2015-3-28 13:34:49 | 只看该作者
我也在用动态加载了,我觉得重点是这几个方面
1、OS实现函数导出表,APP把对OS的API全部基于这个表
2、APP的编译最好地址无关,这样,可以由OS决定加载的地址
3、OS加载APP的时候,做好准备工作,比如,RAM初始化,基地址

出0入0汤圆

24
发表于 2015-3-28 21:53:08 | 只看该作者
McuPlayer 发表于 2015-3-28 13:34
我也在用动态加载了,我觉得重点是这几个方面
1、OS实现函数导出表,APP把对OS的API全部基于这个表
2、APP ...

对这个感兴趣,请楼主和MP哥布道
两工程分别BIN1  BIN2
1  BIN1导出函数和全局变量这个很显然,MAP里有地址,作为指针放到BIN2工程。
2  关键不知道MDK如何生成位置无关,只需要工程设置,还是要如何改启动文件,没有DEMO。   代码位置无关好理解,BIN2本工程内用相对跳转指令,但还是不知道工程该如何设置。 BIN1应该有个装载器来复制和调用BIN2吧,变量数据位置无关没明白如何做的,编译时候指定跟代码位置挨在一起,装载器有1个地址就行还是要分别给代码地址和变量地址, 依然是不知道工程怎么设置。
3  内存是交给BIN1统一管理吧,上面问题通了话,就是BIN1分配地址块给BIN2和撤销了。 装载器得能强制结束万一卡死在死循环的BIN2。
4  好像有C运行库啊什么的吧,比如PRINTF,数学函数之类库函数,这个能否也调用BIN1的。 是不是就是电脑上的静态编译和动态编译的库包含在工程里和调用系统里的区别。

额,最基础一点就是没见过简单的MDK位置无关DEMO工程.

出0入0汤圆

25
发表于 2015-3-28 22:05:53 | 只看该作者
都是高大上的东西啊 什么时候才能达到你们的水平啊 好好学习

出0入0汤圆

26
发表于 2015-3-28 22:10:16 | 只看该作者
myxiaonia 发表于 2015-2-7 07:48
有需求时再搞这个脚本吧,不过rtx本身就是用svc运行系统函数,改造起来还是挺麻烦的 ...

还是没看懂你这个动态加载任务的意义所在啊?
最终不都得通过BIN烧进去!

出0入0汤圆

27
发表于 2015-3-28 22:29:40 | 只看该作者
CM内核人家就是个单片机,非得这么强求人家干嘛嘛

出0入0汤圆

28
 楼主| 发表于 2015-3-28 22:40:26 来自手机 | 只看该作者
kinsno 发表于 2015-3-28 22:10
还是没看懂你这个动态加载任务的意义所在啊?
最终不都得通过BIN烧进去!  ...

你看我楼主位就知道了,最直接目的是复用boot区代码,如果boot区是个全功能rtos,那么app区就可以调用boot区各种系统调用,看上去就像电脑上启动一个应用了,不是有很大灵活性么

出0入0汤圆

29
发表于 2015-3-28 23:13:39 | 只看该作者
myxiaonia 发表于 2015-3-28 22:40
你看我楼主位就知道了,最直接目的是复用boot区代码,如果boot区是个全功能rtos,那么app区就可以调用boo ...

明白了,这个想法够好;

出0入0汤圆

30
发表于 2015-3-29 08:58:51 | 只看该作者
huangqi412 发表于 2015-3-28 21:53
对这个感兴趣,请楼主和MP哥布道
两工程分别BIN1  BIN2
1  BIN1导出函数和全局变量这个很显然,MAP里有 ...

to HQ:
1、我没用全局变量,OS的struct对APP尽量不开放,这样,OS升级对APP影响很小
     也没用函数指针,而是用函数名做Label做跳转,这样写APP的人跟写普通小程序一样
2、MDK有位置无关的设置,在C编译器哪一页,一个是程序位置无关,一个是数据位置无关,既然是位置无关,实际是一个基地址,然后所有Memory都是Offset的
3、如果你的OS有多任务系统,可以建一个任务,然后启动APP,当APP有问题时可以终止它,我的系统简单,APP使用OS的堆栈,物理上是一体的了
4、我的系统简单,为了节约资源,APP使用C运行时库用OS的,甚至ST的固件库,APP也可以从OS借用,好处是节约,坏处是版本一致性维护

出0入16汤圆

31
发表于 2015-3-29 09:10:03 来自手机 | 只看该作者
地址重新定位就可以吧!

出0入0汤圆

32
发表于 2015-3-29 09:12:05 | 只看该作者
另外,不建议直接把中断直接MAP给APP,JMP过去也不好,可以使用驱动程序做中转
对于速度要求高的,在中断函数中使用回调函数,一般情况下,尽量使用Event方式通知APP,然后APP处理,主要是中断节约时间这个原则

如果,打算几个应用公用APP,那么规划OS的API的时候,尽量屏蔽硬件的特殊性,比如Timer全是软Timer方式,当然OS可以根据情况决定把软Timer映射成硬Timer或者一个硬Timer来实现N个软Timer

出0入0汤圆

33
 楼主| 发表于 2015-3-29 13:54:07 | 只看该作者
McuPlayer 发表于 2015-3-29 09:12
另外,不建议直接把中断直接MAP给APP,JMP过去也不好,可以使用驱动程序做中转
对于速度要求高的,在中断函 ...

怎么用驱动程序跳转中断,我发现到最后,rtos使用的中断函数必须要让app程序知道啊

出0入0汤圆

34
发表于 2015-3-29 16:39:05 | 只看该作者
McuPlayer 发表于 2015-3-29 08:58
to HQ:
1、我没用全局变量,OS的struct对APP尽量不开放,这样,OS升级对APP影响很小
     也没用函数指针 ...

感谢MP哥,想了下 ,再请教MP哥
1  用函数名做Label做跳转,  这个不明白,先不想,用指针也能完成功能
2 设置了位置无关后,target页的设置是不是没有意义了。      变量只能在RAM,代码位置无关,可能在ROM运行,也可能在RAM运行。       代码在RAM运行,变量块和代码块可以在一起,只需要给整块一个起始地址参数,但谁在前谁在后?            代码在ROM运行,变量块和代码块必须分开,必须要给变量块和代码块各一个起始地址参数?     调用者应该是用寄存器R多少传递起始地址这个参数给被调用者的,估计MDK手册有规定调用者如何告诉被调用者起始地址的?      以在RAM运行为例,假设各自管理内存,调用者要将被调用者拷入RAM,拷入后被调用者还要用内存, 调用者如何知道该分配多少RAM给被调用者的(代码+变量)用。     
3  APP使用OS的堆栈,物理上是一体的了   空想一下没概念,最近忙,估计得有时间实践下才能有概念。
4  PRINTF之类函数如何实现调用的,也是从MAP里找出来的?
5  中断最简单实现是平台留出函数指针给应用挂入中断处理,应用里面没有中断向量,就是占用中断时间了,再去改成其他高级方法。   这样APP的启动文件似乎要改了?里面的向量表已经没意义了。

出0入0汤圆

35
发表于 2015-3-29 17:39:08 | 只看该作者
myxiaonia 发表于 2015-3-29 13:54
怎么用驱动程序跳转中断,我发现到最后,rtos使用的中断函数必须要让app程序知道啊 ...

挂回调函数是最简单的方式,OS中的ISR程序调用APP提供的回调函数
好处是简单明了,缺点是OS无法约束APP的这个函数尽量精简,比如有人在此函数中使用delay等某个信号

出0入0汤圆

36
发表于 2015-3-29 18:01:38 | 只看该作者
huangqi412 发表于 2015-3-29 16:39
感谢MP哥,想了下 ,再请教MP哥
1  用函数名做Label做跳转,  这个不明白,先不想,用指针也能完成功能
...

1  用函数名做Label做跳转,  这个不明白,先不想,用指针也能完成功能,函数指针也有缺点,一个是调用效率低点,二是多占4个字节RAM,还有,就是你要时刻记着看他是否空指针,如果成了野指针,那更是无法无天
2、程序中有多个段,属性分类,有RO,ZI,RW,RO的只能放程序和const变量,RW的可放程序也可放变量,每个段落都可有自己的基地址,不要用Target页的设置,在link页有个scatter文件,上边有个勾,用了scatter文件,target中的设置会被bypass掉
    APP的基地址,是由OS为他设置的,因为OS负责加载APP的程序,初始化APP的数据区,OS当然知道各个基地址,当然,2次加载有可能基地址变化,因为OS是根据内存的实际情况动态分配
   OS加载APP,程序大小很容易确定,RAM全局变量也很容易确定,不确定的是局部变量和动态申请的内存,这2部分一个在堆里,一个在栈里,我有意把OS和APP公用堆栈,也是为了内存分配效率
3  APP使用OS的堆栈,写APP代码的时候,这部分无关紧要,但OS的部分的时候,要尽量把堆和栈的大小,设置合理些,否则,堆栈溢出,爆掉内存,整个就挂了
4  PRINTF是C运行库函数,写个桩子函数,负责跳转就是了,MDK的连接器,优先抓用户的程序,找不到了才去库里抓
5  OS提供的函数表,尽量约定不能修改,如果必须修改,那么就在后面追加,这样,前面的ID号,仍然OK,但APP如果想使用后追加的API时候,查询系统Ver版本号,然后决定是否用后追加的函数
    windows的32位系统开始于Win98,有些API是从win98就开始的,有些是WinXP才有的,还有些是WinXP SP2才有的,如果程序使用了WinXP才支持的API在win98上运行,则会出现失败的对话框,这个不是API本身有保护功能,而是OS提供的
    如果Win98使用WinXP的驱动程序,而此驱动中又正好使用了Win98不提供的库,那么就不是失败对话框了,而是blue screen了,因为此时OS已无法提供优美的警告了

出100入85汤圆

37
发表于 2015-3-30 14:08:55 | 只看该作者
有简单的例程来帮助我们不懂得小白理解理解的吗

出0入0汤圆

38
发表于 2015-3-30 20:27:19 | 只看该作者
McuPlayer 发表于 2015-3-29 18:01
1  用函数名做Label做跳转,  这个不明白,先不想,用指针也能完成功能,函数指针也有缺点,一个是调用效 ...

感谢MP哥的耐心讲解,大原理看懂,具体做法还是看不懂。 没上过编译原理,计算机结构和操作系统的课,这种软件问题感觉一下无法理解,估计还是得有实践才能懂,这个问题真的很有趣。再想了下
而是用函数名做Label做跳转,     看不懂,系统函数多种多样,有返回值的  无返回的   一个形参的  多个形参的,APP代码要调用各种OS函数,不用指针,这个LABEL看MP哥意思是函数名表?名字而非地址这个能理解,想了下比如名字对应编号做参数,统一调用接口到OS,OS再用编号SWITCH散转各函数,这个统一接口似乎得借用一个中断向量才能保证调用地址永远不变,这样所有的OS函数对APP就不存在地址了,也就没指针的事,不过效率高不高呢,能接受编号多少个呢,或者还有好方法。 但没想通这种情况代码如何做到跟普通函数调用写法一样,如何能调各种类型函数形式编译通过的,特别是到具体实现,是否能截图看看。
RW位置无关        因为RO和RW可能分离两块,感觉APP一定要知道自己用哪块RW区,这个基地址不知道具体怎么传递的,得看图才懂。
PRINTF是C运行库函数,写个桩子函数    桩子函数完全不懂概念
WIN这段说的很精彩通俗易通,  基础应该还是Label做跳转这句,即APP如何调用OS函数。

出0入0汤圆

39
发表于 2015-3-31 00:03:28 | 只看该作者
函数指针的本质是地址,但二者从逻辑上是有区别的
函数指针是个信息更丰富的东东,与地址比较,地址只是个32bit的数据而已,函数指针在此基础上捆绑了,参数的个数,参数的类型,返回值的类型,等信息,这些东西编译器负责检查是否合法

OS提供API一般不建议switch来跳转,确实switch很安全,一堆case之余还有个default来处理未知的API入口,但并非所有的API函数的参数和返回值相同
label可以理解成函数函数指针,但对APP而言是只读的,OS负责在APP运行之前帮他填写正确的地址(重定位)

所以,负责制作APP开发SDK的人,要考虑好这些,尽量让写APP的人不用去思考这些啰嗦的东西
这个确实是个挺繁琐的工作,一个很简单的OS接口也要折腾一两个月,但一劳永逸啊,处处要考虑到后续OS升级后的版本兼容性,这点上Windows比Linux做得好

出0入0汤圆

40
发表于 2015-6-17 13:18:30 | 只看该作者
本帖最后由 gpfrank 于 2015-6-17 13:22 编辑

不知道你看过PEBBLE的智能手表没有?

PEBBLE的智能手表使用的FREERTOS。
采用沙箱的办法实现了应用程序的开发。


1)关于RTT, 使用的是生成位置无关代码。
    烧写入FLASH后,需要在使用时动态加载到RAM中使用RAM的需求非常的大。而且中断等似乎都还有问题。

2)导出函数表的问题。类似于微软的流式驱动,虽然可以放在ROM中吧TEXT段。但是也存在中断等调用的问题。

我也一直在寻找一个想您说的方法。考虑内存的问题,现在仅使用类似流式驱动的办法。

至于PEBBLE 智能手表的办法,还在研究中。

出0入0汤圆

41
发表于 2015-8-24 15:35:40 | 只看该作者
谢谢,mark再看

出0入0汤圆

42
 楼主| 发表于 2016-8-2 12:02:58 | 只看该作者
McuPlayer 发表于 2015-3-28 13:34
我也在用动态加载了,我觉得重点是这几个方面
1、OS实现函数导出表,APP把对OS的API全部基于这个表
2、APP ...

os导出函数调用表,这种做法是不是Windows上dll的做法啊,要用到时候就是一个跳转指令啊嘿嘿,
因为我用的rtx,所以我想到的办法就是再重定向一个svc,然后svc里面按照svc号选择对应的os函数,这样就不需要实际的函数标号地址,而且iap程序就算重新编译,也不怕这些函数标号换地址

用同样的办法我也找到了解决中断例程的问题,就是再用一个svc号的函数,可以注册到对应的向量中断里,这样的话app程序就可以运行中断了

再考虑到我在另一个帖子里找到了mdk下ropi程序的做法,其实到这里我已经可以实现了app程序的动态加载

现在最大的问题是,app程序既然是动态加载的,应该是可以传递 argv 和argc的,现在这个还没有思路,不知道mdk的程序是否支持程序的参数传递功能

出0入0汤圆

43
发表于 2016-8-2 12:28:58 | 只看该作者
myxiaonia 发表于 2016-8-2 12:02
os导出函数调用表,这种做法是不是Windows上dll的做法啊,要用到时候就是一个跳转指令啊嘿嘿,
因为我用 ...

APP通过软中断的方式调用OS提供的服务,也是一个办法,注意参数和返回值的问题就可以了,就像DOS下的int19服务

不建议APP中直接使用向量中断,这样很难做到硬件无关,我本来是OS提供中断的hook接口安装callback函数,后来简化成一律走消息通道

对,要想动态加载,必须ropi设置,rwpi会使代码增大很多,如果能确保所有的变量都在堆上或栈上,不是rwpi也是可以的

传参数是没问题的,不过我使用的入口函数是类似win系统DLL的模型

HRESULT ModuleMain(HANDLE hModule, U32 nReasonForCall, void* pReserved);

出0入0汤圆

44
 楼主| 发表于 2016-8-4 16:04:24 | 只看该作者
McuPlayer 发表于 2016-8-2 12:28
APP通过软中断的方式调用OS提供的服务,也是一个办法,注意参数和返回值的问题就可以了,就像DOS下的int1 ...

我找到了给main函数传递argc,argv的方法,其实就是重定向了arm提供的__ARM_get_argv函数

之前没有找到,请看这里

出0入0汤圆

45
发表于 2016-8-4 17:28:29 | 只看该作者
myxiaonia 发表于 2016-8-4 16:04
我找到了给main函数传递argc,argv的方法,其实就是重定向了arm提供的__ARM_get_argv函数

之前没有找到 ...

你堆栈是怎么处理的?

出0入0汤圆

46
 楼主| 发表于 2016-8-4 19:03:58 | 只看该作者
McuPlayer 发表于 2016-8-4 17:28
你堆栈是怎么处理的?

没有处理,这个有什么特殊的吗?

出10入0汤圆

47
发表于 2023-1-8 22:04:49 | 只看该作者
有用,顶。

出0入0汤圆

48
发表于 2023-6-7 23:27:01 来自手机 | 只看该作者
有用,感谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 03:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表