搜索
bottom↓
回复: 67

使用Cortex-M4的FPU需要知道这个知识点!

  [复制链接]

出870入263汤圆

发表于 2014-10-24 18:59:33 | 显示全部楼层 |阅读模式
本帖最后由 armstrong 于 2014-10-25 10:37 编辑

今天,在安富莱(armfly)的提醒下,了解了一个重要的Cortex-M4知识;也解除了我一直以来:FPU对任务切换造成开销的顾虑!

CM4内核有个叫lazy stacking的特性,目的是减少没必要的浮点寄存器入栈和出栈时间。该特性默认是使能的,所以不需要关注如何开启。
内核进入中断时,如果曾经使用过FPU指令,就会将EXC_RETURN的bit4清零(通过LR访问);否则bit4为1。
如果EXC_RETURN的bit4清零的状态下,内核会自动入栈S0-S15,FPSCR;当然还有另外8个基础寄存器。

所以,我们的任务切换代码仅需要检测LR的bit4,如果该位为零,就入栈剩下的S16-S31即可;如果该位为1,则根本无需保存FPU寄存器,因为该线程未曾使用过FPU。

不过micrium官方移植是没有考虑这点,它只是粗暴的保存和恢复所有FPU寄存器,用起来虽然不会有错误发生,但是没有利用lazy stacking特性,效率很低很低!

这个知识点说出来如此简单!但是如果不知道这个,你会存在很多对FPU的疑虑。






下面这个,才是我们应该特别注意的。


ARM官方的APPNOTE,专门讲解M4F核的FPU Lazy stacking在上下文切换中的应用。


我大致翻译了一下关键说明:
Lazystacking 特性Cortex-M4F新增了一个叫lazystacking的特性。该特性目的是尽量避免中断延迟,它跳过不必要的FPU寄存器组入栈操作来避免中断延迟。以下情况下是不必要保存FPU寄存器组的:
•             中断服务过程中不使用FPU,或者:
•             被中断的线程未曾使用过FPU。
如果中断服务过程使用了FPU并且被中断的线程也使用过FPU, 那么当中断服务过程第一次使用FPU时,FPU寄存器组就必须先保存起来。
Lazy stacking特性是可编程配置的。默认该特性已经开启,软件通过FPCCR寄存器来配置lazy stacking特性。 OS开发者需要特别考虑lazy stacking给线程上下文切换带来的影响。
要确保lazy stacking特性开启,就需要将FPCCR的bit[31](称为ASPEN)和bit[30](称为LSPEN) 都设置为1,这是内核的默认配置。你可以将LSPEN 设置为0来关闭lazy stacking特性。
如果线程曾经使用过FPU, CONTROL寄存器的bit[2](称为FPCA)就会自动置为1。当进入中断时,如果lazy stacking特性已开启,内核就会为FPU预留一个堆栈帧,用于保存FPU的S0-S15和FPSCR寄存器。但是这些FPU寄存器并不会立即入栈,FPCCR 寄存器的bit[0] (称为LSPACT)自动置为1来指示这种状态。EXC_RETURN 的Bit[4]也被清0,用于指示内核已经为FPU预留了堆栈空间,尽管实际上FPU寄存器还没入栈。此后中断服务过程中,有以下情况发生:
•             如果中断服务过程没有使用FPU,LSPACT就一直保持为1到中断结束。中断返回时,内核就检测到EXC_RETURN的bit[4]为0并且LSPACT为1,这意味着堆栈已经为FPU预留了空间,而实际上FPU寄存器并未入栈。因此中断返回时就无需出栈,只需返还栈空间即可。
•             如果中断服务过程中使用了FPU,内核就会自动把FPU的S0-S15和FPSCR入栈,LSPACT同时清0。 当中断返回时,内核检测到EXC_RETURN[4]为0并且LSPACT也为0,这意味着FPU寄存器已经入栈;于是内核执行出栈操作恢复FPU寄存器。
如果lazy stacking特性是关闭的,那么内核进入中断时立即入栈FPU寄存器, 退出中断时总是执行FPU的出栈操作。这就增加了中断延迟。
依据你的应用需求,你可以根据Table 2的指示来配置lazy stacking特性:
Table 2 FPCCR setupprocedure
  
LSPEN
  
  
ASPEN
  
  
Scenarios
  
  
0
  
  
0
  
  
关闭FPU寄存器自动保存和lazy stacking特性:
  
1.             In applications without an embedded OS or  multi-task scheduler, if none of the interrupt or exception handlers use the  FPU.
  
2.             In application code where only one exception  handler uses the FPU. If multiple interrupt handlers use the FPU, they must  not be permitted to be nested. This can be done by setting them to the same  priority level.
  
  
0
  
  
1
  
  
关闭Lazy stacking特性,但是自动保存FPU寄存器开启。
  

CONTROL.FPCA  is automatically set to 1 when floating-point is used. At the exception  entry, the floating-point registers S0-S15, and FPSCR are pushed to the stack  if CONTROL.

  
FPCA is 1.
  
  
1
  
  
1
  
  
Lazy stacking特性开启,自动保存FPU寄存器开启。
  

CONTROL.FPCA  is automatically set to 1 when floating-point is used. If CONTROL.FPCA is 1  at the exception entry, the processor reserves space in the stack frame and  sets LSPACT to 1. But the actual stacking does not happen unless the  interrupt handler uses the FPU.

  
  
1
  
  
0
  
  
无效配置。
  



armfly的ucos-iii移植,RTT的移植,RTX的移植,应该都是将ASPEN置1,LSPEN清0的模式。大家必须注意这点!如果使用内核的默认配置,这些移植是错误的。
因为如果开启了lazy stacking(LSPEN为1),在执行上下文切换时,S0-S15和FPSCR可能还没有真正入栈!即便EXC_RETURN[4]检测为0。

本帖子中包含更多资源

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

x

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-10-24 19:02:27 | 显示全部楼层
不是armfly,是我,我们老大基本不上论坛,一般都是我这个小弟出马。

出870入263汤圆

 楼主| 发表于 2014-10-24 19:06:45 | 显示全部楼层
Eric2013 发表于 2014-10-24 19:02
不是armfly,是我,我们老大基本不上论坛,一般都是我这个小弟出马。 ...

你是挂着老大的腰牌到处坑蒙拐吗?
倒是看得出来你这个小弟对技术挺认真,精神可贵!可以推断你们出的教程里应该有不少干货了!

出0入0汤圆

发表于 2014-10-24 19:07:31 | 显示全部楼层
本帖最后由 aozima 于 2014-10-24 19:11 编辑

RT-Thread已支持此特性: http://www.amobbs.com/thread-5151618-1-1.html
不仅不浪费保存的时间,连空间都不用预留,这样线程栈空间要求小很多。

出870入263汤圆

 楼主| 发表于 2014-10-24 19:10:41 | 显示全部楼层
aozima 发表于 2014-10-24 19:07
RT-Thread已支持此特性

RT-thread是集众RTOS所长,希望能称霸NONMMU微处理器界。

出0入0汤圆

发表于 2014-10-24 19:12:01 | 显示全部楼层
armstrong 发表于 2014-10-24 19:10
RT-thread是集众RTOS所长,希望能称霸NONMMU微处理器界。

感觉大家支持!

出0入0汤圆

发表于 2014-10-24 19:13:37 | 显示全部楼层
armstrong 发表于 2014-10-24 19:06
你是挂着老大的腰牌到处坑蒙拐吗?
倒是看得出来你这个小弟对技术挺认真,精神可贵!可以推断你 ...

教程基本都是我写的,O(∩_∩)O哈哈~,末尾有我的签名

出0入0汤圆

发表于 2014-10-24 19:14:14 | 显示全部楼层
aozima 发表于 2014-10-24 19:07
RT-Thread已支持此特性: http://www.amobbs.com/thread-5151618-1-1.html
不仅不浪费保存的时间,连空间都 ...

支持前辈,支持RTT

出0入0汤圆

发表于 2014-10-24 19:36:19 | 显示全部楼层
砸了房子卖了锅,准备买个安富莱开发板~

出870入263汤圆

 楼主| 发表于 2014-10-24 19:38:24 | 显示全部楼层
qq开始学单片机 发表于 2014-10-24 19:36
砸了房子卖了锅,准备买个安富莱开发板~

兄弟,你这也太有诚意了!可是砸了房子算是哪门子事啊?

出870入263汤圆

 楼主| 发表于 2014-10-24 19:47:20 | 显示全部楼层
aozima 发表于 2014-10-24 19:07
RT-Thread已支持此特性: http://www.amobbs.com/thread-5151618-1-1.html
不仅不浪费保存的时间,连空间都 ...

你好,我刚看了rtt对fpu的移植代码。
  1. rt_hw_context_switch_to:
  2.     LDR r1, =rt_interrupt_to_thread
  3.     STR r0, [r1]

  4. #if defined (__VFP_FP__) && !defined(__SOFTFP__)
  5.     /* CLEAR CONTROL.FPCA */
  6.     MRS     r2, CONTROL         /* read */
  7.     BIC     r2, #0x04           /* modify */
  8.     MSR     CONTROL, r2         /* write-back */
  9. #endif
复制代码

上面看到任务主动切换之前,强制清除CONTROL[2]标志,然后进入PendSV进行上下文切换。
这样做不是强制使得内核不再保存FPU寄存器了吗?如果换出的线程确实需要保存FPU不就出错了吗?

本帖子中包含更多资源

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

x

出870入263汤圆

 楼主| 发表于 2014-10-24 19:55:37 | 显示全部楼层
aozima 发表于 2014-10-24 19:07
RT-Thread已支持此特性: http://www.amobbs.com/thread-5151618-1-1.html
不仅不浪费保存的时间,连空间都 ...


sorry。看明白了,rt_hw_context_switch_to仅用于rtt第一个线程启动,此时可以确定不需要FPU保存,而且堆栈是MSP,也就是复位后进入第一个线程之前的状态。
rt_hw_context_switch_to这个函数相当于ucos的OSStartHighRdy。

出0入0汤圆

发表于 2014-10-24 20:07:12 | 显示全部楼层
这个貌似很高级

出0入0汤圆

发表于 2014-10-24 20:08:45 | 显示全部楼层
armstrong 发表于 2014-10-24 19:47
你好,我刚看了rtt对fpu的移植代码。

上面看到任务主动切换之前,强制清除CONTROL[2]标志,然后进入Pend ...

哈哈 进入PENSV后会真正的进行入栈操作,这里充分利用了cm系列咬尾中断的特性

不知道rtt性能能否和专为cm系列优化的RTX比

出870入263汤圆

 楼主| 发表于 2014-10-24 20:20:02 | 显示全部楼层
myxiaonia 发表于 2014-10-24 20:08
哈哈 进入PENSV后会真正的进行入栈操作,这里充分利用了cm系列咬尾中断的特性

不知道rtt性能能否和专为c ...

请问RTX哪些特性是为cm3优化呢?几乎所有RTOS在cortex-m3上的移植,上下文切换都是用PendSV挂起的咬尾中断特性,这应该不算RTX的优势啊。

出0入0汤圆

发表于 2014-10-24 20:21:42 | 显示全部楼层
ARM官网专门有篇APPNote讲这个事情的。

出0入0汤圆

发表于 2014-10-24 21:00:29 | 显示全部楼层
还真没有注意这个

出0入0汤圆

发表于 2014-10-24 21:02:31 | 显示全部楼层
armstrong 发表于 2014-10-24 19:38
兄弟,你这也太有诚意了!可是砸了房子算是哪门子事啊?

因为我没有房子

出0入0汤圆

发表于 2014-10-25 08:44:36 | 显示全部楼层

出0入0汤圆

发表于 2014-10-25 11:48:34 | 显示全部楼层
不错的资料

出0入0汤圆

发表于 2014-10-25 13:18:16 | 显示全部楼层
楼主说得很清楚,没用过M4,但一看就明白了。
好的移植还可以做很多,如uC/OS:前导零、位段等,对于OS来说相当有效。

出0入0汤圆

发表于 2014-10-25 13:38:48 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2014-10-25 13:41:53 来自手机 | 显示全部楼层
好贴…!!!!

出0入0汤圆

发表于 2014-10-25 23:55:51 | 显示全部楼层
陌拜你的头像,顺路mark!

出0入0汤圆

发表于 2014-10-26 00:18:56 | 显示全部楼层
好,学以致用,马上改

出0入0汤圆

发表于 2014-10-26 11:23:10 来自手机 | 显示全部楼层
ucos2和3怎么改呢....

出870入263汤圆

 楼主| 发表于 2014-10-26 11:25:05 | 显示全部楼层
aozima 发表于 2014-10-24 19:07
RT-Thread已支持此特性: http://www.amobbs.com/thread-5151618-1-1.html
不仅不浪费保存的时间,连空间都 ...

提醒:你的RTOS移植到Cortex-M4F是否将ASPEN置1,LSPEN清0的模式。要不然,仅仅检测EXC_RETURN[4]等于0并不能保证S0-S15和FPSCR已经入栈。因为如果开启了lazy stacking(LSPEN为1),在执行上下文切换时,S0-S15和FPSCR可能还没有真正入栈!即便EXC_RETURN[4]检测为0。请看手册确保!

出870入263汤圆

 楼主| 发表于 2014-10-26 11:25:42 | 显示全部楼层
Eric2013 发表于 2014-10-24 19:13
教程基本都是我写的,O(∩_∩)O哈哈~,末尾有我的签名

提醒:你的RTOS移植到Cortex-M4F是否将ASPEN置1,LSPEN清0的模式。要不然,仅仅检测EXC_RETURN[4]等于0并不能保证S0-S15和FPSCR已经入栈。因为如果开启了lazy stacking(LSPEN为1),在执行上下文切换时,S0-S15和FPSCR可能还没有真正入栈!即便EXC_RETURN[4]检测为0。请看手册确保!

出0入0汤圆

发表于 2014-10-26 11:51:49 | 显示全部楼层
armstrong 发表于 2014-10-26 11:25
提醒:你的RTOS移植到Cortex-M4F是否将ASPEN置1,LSPEN清0的模式。要不然,仅仅检测EXC_RETURN[4]等于0并 ...

不需要的,检测某个线程是否使用FPU方式很多的。

出0入0汤圆

发表于 2014-10-26 11:52:49 | 显示全部楼层
windrarara 发表于 2014-10-26 11:23
ucos2和3怎么改呢....

这里有已经改好的:http://www.amobbs.com/thread-5579473-1-1.html

出870入263汤圆

 楼主| 发表于 2014-10-26 11:54:09 | 显示全部楼层
Eric2013 发表于 2014-10-26 11:52
这里有已经改好的:http://www.amobbs.com/thread-5579473-1-1.html

有些时候,写程序的思维定势,是很难发现错误的。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-10-26 11:57:11 | 显示全部楼层
armstrong 发表于 2014-10-26 11:54
有些时候,写程序的思维定势,是很难发现错误的。

不用搞成这样,你可以自己写个代码亲自验证。时间是检验真理的唯一标准。
你要是不放心可以去KEIL的官方论坛给他们发个帖子,说你们的RTX开启FPU错了。

出870入263汤圆

 楼主| 发表于 2014-10-26 11:59:27 | 显示全部楼层
RTX的写手跟micrium也差不了多少的。你别把人家当上帝。

出0入0汤圆

发表于 2014-10-26 12:00:19 | 显示全部楼层
armstrong 发表于 2014-10-26 11:59
RTX的写手跟micrium也差不了多少的。你别把人家当上帝。

你要不信就算了。你自己写个代码验证下,证明我们的错了,我就信你。

出870入263汤圆

 楼主| 发表于 2014-10-26 12:00:30 | 显示全部楼层
Eric2013 发表于 2014-10-26 11:57
不用搞成这样,你可以自己写个代码亲自验证。时间是检验真理的唯一标准。
你要是不放心可以去KEIL的官方 ...

你在代码中配置过FPCCR寄存器吗,在哪个文件哪一行?

出870入263汤圆

 楼主| 发表于 2014-10-26 12:08:13 | 显示全部楼层
Eric2013 发表于 2014-10-26 12:00
你要不信就算了。你自己写个代码验证下,证明我们的错了,我就信你。

还有你曾经说过micrium的FPU移植是错误的,其实它是正确的。只不过没有使用FPU自动保存功能而已!你看人家的os_cpu_c.c文件中,OSTaskStkInit函数的注释有这么一行说明:
  1. (1) When enabling the FP co-processor, make sure to clear bits ASPEN and LSPEN in the
  2. *                          Floating-Point Context Control Register (FPCCR).
复制代码


它们的移植没没有利用FPU自动保存功能,这样虽然用起来麻烦点。但这样就跟ARM9上的FPU移植通用了!

出870入263汤圆

 楼主| 发表于 2014-10-26 12:11:32 | 显示全部楼层
Eric2013 发表于 2014-10-26 12:00
你要不信就算了。你自己写个代码验证下,证明我们的错了,我就信你。

你搞错了,我自己做项目肯定用自己的方法。
但是,你就不一样了,你作为教程是会误导别人的,责任很大啊!

出0入0汤圆

发表于 2014-10-26 12:17:04 | 显示全部楼层
armstrong 发表于 2014-10-26 12:11
你搞错了,我自己做项目肯定用自己的方法。
但是,你就不一样了,你作为教程是会误导别人的,责任很大啊 ...

好,我在误导大家。讨论就此结束。

出870入263汤圆

 楼主| 发表于 2014-10-26 12:22:17 | 显示全部楼层
Eric2013 发表于 2014-10-26 12:17
好,我在误导大家。讨论就此结束。

你还是太年轻了!我看RTT移植人的反映如何,应该不会跟你这样。

出0入0汤圆

发表于 2014-10-26 12:55:27 | 显示全部楼层
armstrong 发表于 2014-10-26 12:22
你还是太年轻了!我看RTT移植人的反映如何,应该不会跟你这样。

不好意思啊,别介意,说话有些冲动,我再研究下这个Lazy特性。

出0入0汤圆

发表于 2014-10-26 13:11:14 | 显示全部楼层
armstrong 发表于 2014-10-26 11:25
提醒:你的RTOS移植到Cortex-M4F是否将ASPEN置1,LSPEN清0的模式。要不然,仅仅检测EXC_RETURN[4]等于0并 ...

学习了,抽空检查确认一下。
再写个测试程序验证一下。
谢谢指出。

出870入263汤圆

 楼主| 发表于 2014-10-26 13:11:16 | 显示全部楼层
本帖最后由 armstrong 于 2014-10-26 13:38 编辑

这是我在《Cortex-M4(F) Lazy Stacking and Context Switching》的内容截图,提取重点:

有需要的好好分析一下,我说的是否有错。

本帖子中包含更多资源

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

x

出870入263汤圆

 楼主| 发表于 2014-10-26 13:17:03 | 显示全部楼层
本帖最后由 armstrong 于 2014-10-26 13:43 编辑
aozima 发表于 2014-10-26 13:11
学习了,抽空检查确认一下。
再写个测试程序验证一下。
谢谢指出。


谢谢,我是本着讨论的态度提出疑问的。希望能得到问题的正确答案,目前看来,只有micrium的官方移植避开了lazy stacking特性,而RTX,freeRTOS,RTT都存在我说的疑问:
好的项目存在错误不是问题,问题是不愿面对错误啊,linux还在不停的修正中呢。我相信RTT的维护成员能正视用户反馈的问题!

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-10-26 13:28:05 | 显示全部楼层
这个帖子好,我去自查了

出870入263汤圆

 楼主| 发表于 2014-10-26 13:31:22 | 显示全部楼层
楼主位不能编辑了,我只有在下面追加内容了,这幅图是提出问题的关键,有疑问的网友可以看看:

本帖子中包含更多资源

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

x

出870入263汤圆

 楼主| 发表于 2014-10-26 13:34:07 | 显示全部楼层
ggchao 发表于 2014-10-26 13:28
这个帖子好,我去自查了

谢谢!最好能下载楼主为提供的PDF文档《Cortex-M4(F) Lazy Stacking and Context Switching》,这是ARM官方的,专门讲的就是“FPU与上下文切换”相关知识点。

出0入0汤圆

发表于 2014-10-26 14:20:37 | 显示全部楼层
关于你的说的ASPEN和LESPEN都是1的情况下,只保留了空间而没有实际入栈的问题。

实际检测了bit[4] of EXC_RETURN后,调用FPU指令就可以出发入栈操作。而且你要注意这句话
But the actual stacking does not happen unless the  interrupt handler uses the FPU.

在PendSV中断里面调用FPU指令VSTMDBEQ(Floating-point Store Multiple command) 会触发S0-S15 FPSCR入栈。

下面是ARM那个手册给出的RTOS中多任务使用FPU的两种方式,基本都是用的第二中:

本帖子中包含更多资源

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

x

出870入263汤圆

 楼主| 发表于 2014-10-26 14:34:56 | 显示全部楼层
Eric2013 发表于 2014-10-26 14:20
关于你的说的ASPEN和LESPEN都是1的情况下,只保留了空间而没有实际入栈的问题。

实际检测了bit[4] of EXC_ ...

我看过了,这个图很清晰得化解了我的疑问,谢谢!原来VSTM也作为FPU寄存器触发保存的指令,这是重要的,我却忽略了,原因在于我没有通篇阅读《Cortex-M4(F) Lazy Stacking and Context Switching》。
好,我现在确认了你的操作是正确的。还有RTT,FreeRTOS都是正确的!

出870入263汤圆

 楼主| 发表于 2014-10-26 14:37:38 | 显示全部楼层
aozima 发表于 2014-10-26 13:11
学习了,抽空检查确认一下。
再写个测试程序验证一下。
谢谢指出。


你好,RTT的移植是没有问题的,使用芯片默认设置(ASPEN=1,LSPEN=1)即可正确入栈FPU寄存器,因为VSTM指令可以触发FPU寄存器的实际入栈动作。见本帖47楼!

出0入0汤圆

发表于 2014-10-26 14:38:47 | 显示全部楼层
armstrong 发表于 2014-10-26 14:34
我看过了,这个图很清晰得化解了我的疑问,谢谢!原来VSTM也作为FPU寄存器触发保存的指令,这是重要的, ...

最后还是说声对不起,中间讨论的时候,我激动了。的确是你说的那句话,我还太年轻,遇到事情就激动,以后得改改。

出870入263汤圆

 楼主| 发表于 2014-10-26 14:48:36 | 显示全部楼层
本帖最后由 armstrong 于 2014-10-26 14:49 编辑
Eric2013 发表于 2014-10-26 14:38
最后还是说声对不起,中间讨论的时候,我激动了。的确是你说的那句话,我还太年轻,遇到事情就激动,以后 ...


善哉善哉!我也不是要倚老卖老,并不是持着“教导”的态度;我是就事讨论呢。其实我也一样急切的想搞清楚这个疑问,但没有把文档通篇读完,所以还是存在疑问,浮躁了。
现在问题解除,对你表示感谢!看得出来你技术钻研,积极进取,是个有智慧的人。

出0入0汤圆

发表于 2014-10-26 16:25:03 | 显示全部楼层
armstrong 发表于 2014-10-26 14:37
你好,RTT的移植是没有问题的,使用芯片默认设置(ASPEN=1,LSPEN=1)即可正确入栈FPU寄存器,因为VSTM指 ...


当原线程要被切换走时,如果有使用FPU,会保存剩下的不会被自动保存的变量。
其中的V开头的指令会触发FPU真正存储那些应该被自动保存的FPU寄存器。

楼主看得很细,值得学习!

出870入263汤圆

 楼主| 发表于 2014-10-26 16:28:55 | 显示全部楼层
aozima 发表于 2014-10-26 16:25

当原线程要被切换走时,如果有使用FPU,会保存剩下的不会被自动保存的变量。
其中的V开头的指令会触发 ...

说来惭愧,这个问题打搅了Eric2013网友不少次数,最终还是由他帮我解决了疑问。现在我是明白这个知识点了,但对于Eric2013和你,却没有什么实际的意义,因为你们本来就是对的!

出0入0汤圆

发表于 2014-10-26 16:32:18 | 显示全部楼层
剥夺性的操作系统,都是使用的

出0入0汤圆

发表于 2014-10-26 16:33:05 | 显示全部楼层
都是适用的,但估计很多场合效率影响并不大

出0入0汤圆

发表于 2014-10-26 19:17:07 来自手机 | 显示全部楼层
armstrong 发表于 2014-10-26 16:28
说来惭愧,这个问题打搅了Eric2013网友不少次数,最终还是由他帮我解决了疑问。现在我是明白这个知识点了 ...

你是故意刺激他们啊哈哈哈

出0入0汤圆

发表于 2014-10-26 19:27:08 | 显示全部楼层
不错,帮顶              

出870入263汤圆

 楼主| 发表于 2014-10-26 20:11:14 | 显示全部楼层
myxiaonia 发表于 2014-10-26 19:17
你是故意刺激他们啊哈哈哈

我哪里会是那么老奸巨猾的,我是认认真真的。

出0入0汤圆

发表于 2014-10-26 20:13:22 | 显示全部楼层
不错,虽然还没用到,但是先收藏了

出0入0汤圆

发表于 2014-10-26 20:16:52 | 显示全部楼层
armstrong 发表于 2014-10-26 20:11
我哪里会是那么老奸巨猾的,我是认认真真的。

你很认真,硬汉兄也很认真。。。值得敬佩的两位坛友

出870入263汤圆

 楼主| 发表于 2014-10-26 20:19:56 | 显示全部楼层
myxiaonia 发表于 2014-10-26 20:16
你很认真,硬汉兄也很认真。。。值得敬佩的两位坛友

真有你的!你把“艾瑞克”称为硬汉,不知道人家喜欢不。

出0入0汤圆

发表于 2014-10-26 20:20:49 | 显示全部楼层
mark 谢谢

出0入0汤圆

发表于 2014-10-26 20:22:13 | 显示全部楼层
armstrong 发表于 2014-10-26 20:19
真有你的!你把“艾瑞克”称为硬汉,不知道人家喜欢不。

我也奇怪他为何又叫硬汉兄呢,好像QQ上是这个

出870入263汤圆

 楼主| 发表于 2014-10-26 20:23:42 | 显示全部楼层
myxiaonia 发表于 2014-10-26 20:16
你很认真,硬汉兄也很认真。。。值得敬佩的两位坛友

通过我们的讨论过程,能为其它需要的坛友提供一个参考资源,也算是勉强有点意义了。

出0入0汤圆

发表于 2014-10-26 20:24:26 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2014-10-26 23:34:37 来自手机 | 显示全部楼层
必须知道mark一下

出0入0汤圆

发表于 2014-10-27 06:47:43 | 显示全部楼层
CM4 还没机会玩,一定要玩玩。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-29 08:56

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

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