搜索
bottom↓
回复: 67

裸奔到OS的挑战——cpu速度、内存、人。

[复制链接]

出0入0汤圆

发表于 2009-12-3 09:49:27 | 显示全部楼层 |阅读模式
嵌入式设备网络化、u盘化、功能复杂化的趋势,使越来越多的、过去可以用裸奔实现的嵌入式产品,产生了应用操作系统的需求。
而人力成本的持续上升、芯片成本的连续下降,以及cpu性能的迅速提高,又为大面积应用操作系统提供了物质基础。
    本文和大家一起讨论一下,从裸奔到操作系统,我们将面对什么挑战。

1、速度
    我们首先面对的,将是cpu运行速度的问题,毋庸置疑,操作系统调度需要cpu开销,需要cpu有更高的速度来弥补;再者,嵌入式系统经常用于实时控制,需要较高的定时精度,缩短tick时间间隔有利于提高控制精度,嵌入式系统中经常使用1mS甚至更短的tick间隔。然而,tick间隔越短,调度开销就越高,同样需要更高的cpu速度来弥补。当前日益提高的嵌入式cpu的性能,甚至单片机都32位了,很好地回答了这个问题。
   
2、内存容量
    先思考一个问题,一个原先需要50K内存的裸奔程序,如果移植到自身开销1K内存的RTOS下面,需要增加多少内存?是51K吗?
    有许多嵌入式操作系统,都把运行操作系统的内存开销作为主要性能指标,有些甚至声称不到1K内存就可以运行。但我们千万不要被误导,以为用操作系统需要的内存与裸机差不多,只要比裸奔程序多那么1K、2K就行了。操作系统会使应用程序所需要的内存暴增,使用操作系统所增加的内存需求,主要来自以下方面:
1)运行操作系统本身需要的内存。
2)创建线程控制块、消息控制块等操作系统组件需要的内存。
3)每个线程配置独立的栈所增加的内存需求。
   其中第一项很好理解,几乎所有操作系统都会给出这个指标。第二项也容易理解,不用操作系统的情况下,我们常常定义标志位或全局变量来在不同模块之间传递信息,需要的内存就很少。而操作系统模式下,需要用到同步、互斥、线程间交换数据等,这就需要使用信号量、邮箱等操作系统组件,信号量需要分配信号量控制块,邮箱需要分配邮箱控制块……,这些,都需要消耗可观的内存。许多操作系统标明的,仅仅是OS本身运行需要的内存,并不包括信号量控制块拉、邮箱控制块拉等等这些操作系统组件需要的内存。我们知道,一个仅运行OS的系统,是毫无意义的,真正实现产品功能的,是应用程序。
    说了半天,其实也只讲了操作系统对内存需求的冰山一角,OS下编程,对内存需求的影响最大的,当属OS的多线程并发特性,这使得我们要为每一个线程分配独立的栈。下面我们定性分析一下栈独立化带来的内存需求变化。栈是用来保存函数参数和局部变量的,可以说,有函数调用,就有局部变量。在单线程环境下,应用程序需要的栈,几乎就是main函数需要的栈,而在多线程环境下,每个线程的栈是独立的,分别等于该线程的线程执行函数所需要的栈,而系统总的栈需求,就是所有线程的栈需求之和。
    假设有一不使用OS的应用程序,main函数如下:
void main(void)
{
    while(1)
    {
        func1();    //本函数需要10K栈
        func2();    //本函数需要5K栈
        func3();    //本函数需要9K栈
        func4();    //本函数需要8K栈
        func5();    //本函数需要9K栈
    }
}
    在超级循环中,分别调用了func1~func5这5个函数,他们的栈需求分别是10K、5K、9K、8K、9K。调用func1时,系统分配10K的ram作为栈,func1函数返回,这10K空间将被释放,并且再次分配给func2使用,所以,整个程序的栈需求,就是这5个函数中需要栈最多的那个函数需要的栈空间:10K。
    如果要把这个程序移植到OS下,最简单的方法就是创建5个线程来调用func1~5这5个函数,这5个线程需要的栈分别是10K、5K、9K、8K、9K,而这5个栈是独立的,不能共用,程序总共需要的栈空间是(10+5+9+8+9)=41K,线程栈一般是从堆中动态分配的,考虑到动态分配本身的开销,硬件须准备50K以上的内存用于程序的运行栈。一下子增长到5倍,没想到吧。
    可见,上操作系统,虽然操作系统本身不需要很大内存,但会极度增加应用程序的内存需求。做项目时,一是不要盲目上OS,要根据需求综合考虑,二是设计硬件系统时,应该充分考虑到内存方面的需求,配置充足的内存。

3、人
    任何产品都是由人开发的,所以,讨论嵌入式产品开发的任何话题,都不能离开人的因素,科技以人为本嘛!从裸奔到操作系统,那么程序员,也将由编写裸奔程序转为在操作系统下编程。这些迅速、大量增加的程序员,他们可能习惯了在裸奔环境下编程,他们可能是化工、建筑、地质等不同行业的专家,他们也许已经上了年纪,没有太多的精力学习多线程编程等知识。这个问题,本文暂不深入讨论。

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

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

出0入0汤圆

发表于 2009-12-3 10:35:16 | 显示全部楼层
支持一下。

出0入0汤圆

发表于 2009-12-3 10:46:09 | 显示全部楼层

出0入0汤圆

发表于 2009-12-3 10:51:08 | 显示全部楼层
那就需要你做个无操作系统的路由了……

出0入0汤圆

发表于 2009-12-3 11:06:28 | 显示全部楼层
支持一下打酱油OS

出0入0汤圆

发表于 2009-12-3 11:15:43 | 显示全部楼层
楼主说到点子上了,小型的系统上OS是很吃亏的,大量占用RAM不算,还占用CPU时间去压堆栈出堆栈,切换进程。

另外,合理分配时隙才是裸奔编程的重点,

出0入0汤圆

 楼主| 发表于 2009-12-3 11:18:31 | 显示全部楼层
4楼好幽默,真没想到,djy还可以翻译成打酱油,打酱油是老百姓都要做的事,听起来亲切。

我敢打赌,以后“打酱油OS”的名号,肯定比“都江堰OS”普及,可不许收版权费啊。

出0入0汤圆

发表于 2009-12-3 11:26:55 | 显示全部楼层
有点疑问

死循环可以申请和释放内存,多任务为什么不可以申请和释放内存


缩短tick时间间隔有利于提高控制精度, 此言差异,谁这样做,谁的控制精度不会高的,处理方式和思维方向就错了, 试问谁的高精度控制用查询,OS的任务调度锁定和信号不是摆设

裸奔和OS没有联系,只是不同的处理方式和处理理念, OS干的事情裸奔可以干,裸奔干的事情OS也可以干

出0入0汤圆

发表于 2009-12-3 12:52:15 | 显示全部楼层
好像都有道理 我也疑惑了

出0入0汤圆

发表于 2009-12-3 13:02:32 | 显示全部楼层
7楼说裸奔干的事情OS也可以干太绝对,我的一个系统要信号来时处理2us脉冲串,最长连续300ms不能被打断,OS的TICK会中断导致信号处理失败

出0入0汤圆

发表于 2009-12-3 13:08:09 | 显示全部楼层
恩,同意楼上的说法,增加操作系统并不能提高程序的效率和精度。

出0入0汤圆

发表于 2009-12-3 13:54:15 | 显示全部楼层
kanbudong

出0入0汤圆

发表于 2009-12-3 14:04:30 | 显示全部楼层
呵呵,抬杠的来了

回答9楼问题:
0.1us也好,2us也好,只要MCU可以识别,都可以处理,您说处理这个300ms脉冲串不可以被打断,那将意味他300ms内要独占MCU,跟OS没关系,任何处理方式都是关闭中断下干活或最高级中断干活,最简单的办法就是在OS下进入临界处理就可以了,OS_ENTER_CRITICAL(); 如果有实时状态刷新,就会出现所谓的卡机, 纯软件处理300ms独占MCU,不借助任何硬件都会卡,跟OS没关系

如果您想开中断,允许更高的中断处理,那么你只需要稍作修改OS临界代码,只关闭TiCK出发而已,不要关闭总中断. 系统照样可以响应高级中断,这时候要注意处理全局变量的协调问题,如果只是处理300ms脉冲串,那就小菜一碟了

出0入0汤圆

发表于 2009-12-3 15:55:39 | 显示全部楼层
12楼,如果关闭了TICK,则系统所有依赖于TICK的节拍都停了,这样的OS还想做啥?又不能调度了

出0入0汤圆

发表于 2009-12-3 17:26:56 | 显示全部楼层
mark.

出0入0汤圆

发表于 2009-12-3 17:58:53 | 显示全部楼层
各人的编程方法不一样。

主循环协作调度 与 多任务抢占调度 各建立一个系统,适合哪种就用哪种。

个人更喜欢 多任务抢占调度,不过,真正适合在小RAM(2K以内)上跑的OS几乎没有,
UCOS,FREERTOS,过于庞大。

找不到比较合适的OS,只好自己写的玩玩。

出0入0汤圆

发表于 2009-12-3 20:54:01 | 显示全部楼层
对于小型系统(16KROM,2KRAM以下),本人更倾向于用简单的时间调度。一般是用状态机分解各个模块,让每次主循环调用模块主函数的处理时间都控制在TIMETICK之内,这样对信号的响应时间都是固定并可以准确预测的,各个模块可以并行运作之余还能省掉一些信号中断。

出0入0汤圆

 楼主| 发表于 2009-12-4 09:45:47 | 显示全部楼层
一篇小文章,引来口水哗哗,大有水淹龙王之意,罪过罪过,阿尼陀佛!
其实我的文章根本没有比较os与裸奔的优劣,也没有讨论os与裸奔的编程方法的异同。
只是说,如果要上OS的话,面临什么问题。
就像告诫你,开车要面临的安全问题,没有教你开车的意思,也没有要你去开车的意思,更没有比较开车与步行或者公交的优劣。

出0入0汤圆

发表于 2009-12-4 16:30:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-5 11:00:58 | 显示全部楼层
最近也在犹豫中。我喜欢裸奔的程序。所有的都在自己控制之下。但是系统越来越大了,感觉自己越来越控制不了了。而上了系统后会造成整体效率下降,好多问题只能另外再想解决方法了。用了系统其实是为了利用别人的经验。为了能够快速开发。所以上了系统可能就要要求低一些,必须要受到一些条框的限制。这也许就是所谓的标准吧。
    牺牲灵活性、效率、可靠性来换取快速开发、降低开发工作量。反正是每个人_权衡吧。不知道我的理解对不对。下面继续

出0入0汤圆

发表于 2009-12-12 16:52:44 | 显示全部楼层
在OS方面还是个小白,就不发表什么评论了,还是一句话,自己看着办,各有优点吧,看自己的项目需求

出0入0汤圆

发表于 2009-12-13 01:42:11 | 显示全部楼层
我对楼主的水平越来越怀疑.

出0入0汤圆

发表于 2009-12-26 08:54:34 | 显示全部楼层
说得很好,呵呵。多发这种文章,楼主才能火起来。

出10入95汤圆

发表于 2009-12-26 22:10:02 | 显示全部楼层
赞同21楼的说法。

出0入296汤圆

发表于 2009-12-26 22:18:04 | 显示全部楼层
不喜欢OS……
但是自己做的事情总是无意间作了一个小OS……

出0入0汤圆

发表于 2009-12-26 22:29:09 | 显示全部楼层
回复【26楼】Gorgon Meducer 傻孩子
不喜欢OS……
但是自己做的事情总是无意间作了一个小OS……
-----------------------------------------------------------------------

手中无剑、心中也无剑……

出0入0汤圆

发表于 2010-1-11 00:19:24 | 显示全部楼层
支持4楼6楼。“都江堰OS”名字宏大,“打酱油OS”名字亲民。一个大名,一个外号。

出0入0汤圆

发表于 2010-2-10 23:53:06 | 显示全部楼层
假设有一不使用OS的应用程序,main函数如下:
void main(void)
{
    while(1)
    {
        func1();    //本函数需要10K栈
        func2();    //本函数需要5K栈
        func3();    //本函数需要9K栈
        func4();    //本函数需要8K栈
        func5();    //本函数需要9K栈
    }
}
    在超级循环中,分别调用了func1~func5这5个函数,他们的栈需求分别是10K、5K、9K、8K、9K。调用func1时,系统分配10K的ram作为栈,func1函数返回,这10K空间将被释放,并且再次分配给func2使用,所以,整个程序的栈需求,就是这5个函数中需要栈最多的那个函数需要的栈空间:10K。
    如果要把这个程序移植到OS下,最简单的方法就是创建5个线程来调用func1~5这5个函数,这5个线程需要的栈分别是10K、5K、9K、8K、9K,而这5个栈是独立的,不能共用,程序总共需要的栈空间是(10+5+9+8+9)=41K,线程栈一般是从堆中动态分配的,考虑到动态分配本身的开销,硬件须准备50K以上的内存用于程序的运行栈。一下子增长到5倍,没想到吧。
    可见,上操作系统,虽然操作系统本身不需要很大内存,但会极度增加应用程序的内存需求。做项目时,一是不要盲目上OS,要根据需求综合考虑,二是设计硬件系统时,应该充分考虑到内存方面的需求,配置充足的内存。
-------------------------------------

Mark

出0入0汤圆

发表于 2010-2-11 09:34:40 | 显示全部楼层
目前嵌入式的应用大多不会用到10K堆栈的。

32K FLASH, 8KRAM, 这种配置无论如何都用不到多达K级的堆栈。

子程序又能嵌套几级? 程序参数多了用个指针就好了。

出0入0汤圆

 楼主| 发表于 2010-2-11 10:26:55 | 显示全部楼层
嗯,只是个夸张点的比喻,不必追究数字。
我要说明的,只是考虑上OS时,不要只看OS本身用多少内存,而是要多考虑应用程序消耗内存从裸奔到OS的增量部分。

出0入0汤圆

发表于 2010-2-12 12:50:28 | 显示全部楼层
凡事有一利,必有一弊。

用RTOS的弊是:
1。额外的FLASH和RAM开销。
除了OS要用的资源外,每个任务还有额外的堆栈开销,320字节;TCB开销,100字节左右;如果是任务间通讯,还有通讯的额外开销,比如EVENT, SEMP., MAILBOX, 都需要额外的RAM开销。与共享变量来比,肯定耗费RAM多的多,但是安全
2。OS在CPU速度的开销
用了OS之后,多任务的OS, 最多最多,只能用到CPU频率的70%,实际上算为50%比较妥当。 那又300MS的要求的,可以锁住调度器,300MS之后重新开启。别说不是多任务了。你那要求如果不用DMA, 其它任何方式都没有办法再300毫秒之时做别的东西。

当然,OS的好处就是程序更条理化,结构化,代码复用容易。

出0入0汤圆

发表于 2010-2-21 22:37:34 | 显示全部楼层
就在这里吧,希望能有人给我这样的菜鸟扫下白:
1.基于单片机编写操作系统的目的是什么呢?它和我们比较熟悉的像windows操作系统有什么关系呢?
2.对于PC没有操作系统,我们通常叫裸机,裸机没办法干活的,但是一个单片机没有操作系统,编个程序也可以运行,像我们使用的office 等软件都是基于windows操作系统编写的,但是单片机的话没有操作系统也可以编写一个程序执行。
3.说白了,单片机的操作系统到底是干什么的呢?想的我都晕了,基于一个单片机操作系统的编程是不是和不用操作系统编程就不一样了,比如说编个流水灯的程序,有操作系统和没操作系统是不是程序不一样了呢?

出0入0汤圆

发表于 2010-2-22 04:43:42 | 显示全部楼层
回答33楼:

1.反问你一下,请问OS的作用是什么?
2.谁说的PC机不能裸机干活?为什么非得用OS,你答出前面一问本问自然有答案
3.如果真正的程序跟流水灯一样简单,那所有的开发任务我们都可以一笑而成了

出0入0汤圆

发表于 2010-2-22 09:12:02 | 显示全部楼层
1.操作系统(简称OS)是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。
2.现在想想似乎对单片机的操作系统也慢慢的有了认识。
3.对于简单的程序当然不需要什么操作系统来进行管理,如流水灯那样的程序,当我们面对的是庞大的控制系统时(比如说工业控制),操作系统的优势就体现出来了,控制其他程序的执行,管理系统资源等。
4.谢谢LS的提醒。

出0入0汤圆

发表于 2010-4-13 18:07:46 | 显示全部楼层
mark 了 楼主辛苦了 呵呵

出0入0汤圆

发表于 2010-7-30 00:12:11 | 显示全部楼层
很多场合下,上OS是很有优势的,比如GUI,使用OS会更好点,当然,如果你用裸奔也没人说啥
我觉得楼主是很值得称赞的,另外那种说某某人说的这不对那不对的的人,很讨厌,
尤其像概念性的东西,理解错误在所难免,人都是由无知变有知的

出0入0汤圆

发表于 2010-7-30 14:29:26 | 显示全部楼层
OS的最大作用是把底层的硬件驱动跟上层的应用连接起来,上层的应用可以跟底层的驱动分开来开发

而裸奔的层次往往是不明显,甚至一些小程序根本不需要分层

出0入9汤圆

发表于 2010-7-30 16:47:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-12 08:32:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-18 11:58:59 | 显示全部楼层
用不用OS,个人觉得还是在用什么样的芯片和场合.有丰富资源的CPU和功能复杂的程序结构的系统,上一个OS所得到的好处远大于维护裸奔系统的付出。
功能,结构相对简单一点,就可以裸奔,至于简单到什么程度才裸奔就根据自己喜好了。 我觉得只要在硬件条件允许的情况下尽量上OS,提升以后的扩展性

出0入0汤圆

发表于 2010-10-18 18:05:37 | 显示全部楼层
对于复杂一点的程序,用OS是有相当好处的。
    1、把复杂问题简单化。
    这里要用到面向对象的思想。一般来说,OS要提供信号量、邮箱、互质量、事件等线程同步与通信的机制,只要能充分利用这些东东,程序的稳定性是没有问题的。在实现功能时,把每个功能当对象看待,设计出几个对外的接口(比如:打开设备、读/写、关闭设备等),就能把复杂问题简单化。

    2、程序的维护、升级简单化。
    由于采用面向对象的思想,当程序要增加新功能或在处理方面进行升级,只需增加或修改部分代码,调试、开发相对比较简单。


    缺点:
    上述很多人已经提到,采用OS之后,会增加额外的内存,线程切换时会增加额外的代码和执行时间等。在MCS-51、AVR等单片机上,由于RAM相对比较少,采用OS,有些时候是不能满足要求的。比如:在AVR单片机上,有32个寄存器,要进行一次线程切换,需要保存原线程的这些寄存器,同时,还要恢复新线程的这些寄存器,代价是比较大的;同时,AVR系列单片机的RAM也比较少,只有1K/2K/4K之类,不太适合采用OS。

出0入0汤圆

发表于 2010-11-16 11:46:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-29 16:39:40 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-3-27 21:03:58 | 显示全部楼层
mark!!!!

出0入0汤圆

发表于 2011-3-28 10:57:51 | 显示全部楼层
mark

出5入42汤圆

发表于 2011-3-28 15:07:45 | 显示全部楼层
读了这个帖 我对嵌OS有了进一步的了解
谢谢楼主

出0入0汤圆

发表于 2011-3-28 15:16:22 | 显示全部楼层
我现在的程序还是用的查询,虽然暂时没有遇到瓶颈,但估计也差不多了。我的都是这种结构:

main()
  {
      if(flag1){fun1();}
      if(flag2){fun2();}
      if(flag3){fun3();}
      if(flag4){fun4();}
      。。。。。
   }

出0入0汤圆

发表于 2011-3-28 15:30:40 | 显示全部楼层
mark了学习~

出0入0汤圆

发表于 2011-8-23 13:44:02 | 显示全部楼层
回复【20楼】wcm_e
-----------------------------------------------------------------------

赞同!!!!!!!!!!!!!

出0入0汤圆

发表于 2011-8-23 13:55:15 | 显示全部楼层
回复【38楼】ngei
-----------------------------------------------------------------------

说的太好了!

出0入0汤圆

发表于 2011-10-29 15:14:13 | 显示全部楼层
田园兄说得很好,呵呵

出0入0汤圆

发表于 2011-11-28 17:02:16 | 显示全部楼层
要支持多复杂的任务就使用os,否则就裸机跑

出0入0汤圆

发表于 2011-11-29 22:05:35 | 显示全部楼层
楼主有没有考虑到,os可以简化开发过程?

出0入0汤圆

发表于 2011-11-29 23:20:34 | 显示全部楼层
上面的那个程序也可以直接放到OS上去跑呀,凭什么要用线程?
更何况线程还不一定是标准库里的。

出0入0汤圆

发表于 2011-11-30 10:19:10 | 显示全部楼层
从学习做起

出0入0汤圆

发表于 2011-12-4 06:54:12 | 显示全部楼层
楼主,如果程序的结构不像你说的那么简单呢?比如:
比如有一点点函数的嵌套。。。。
void main(void)
{
    while(1)
    {
        func1();    //本函数需要10K栈
        func2();    //本函数需要5K栈
        func3();    //本函数需要9K栈
        func4();    //本函数需要8K栈
        func5();    //本函数需要9K栈
    }
}

void func1()
{
    func2();
    func3();
}

出0入0汤圆

发表于 2011-12-4 06:57:36 | 显示全部楼层
回复【9楼】NJ8888  
7楼说裸奔干的事情os也可以干太绝对,我的一个系统要信号来时处理2us脉冲串,最长连续300ms不能被打断,os的tick会中断导致信号处理失败
-----------------------------------------------------------------------

OS里面有一种叫做“临界段”的东东啊。比如操作系统原语。
或者多核心系统,像TI DaVinci一样,用ARM跟用户打交道,用DSP来处理你的信号,
抑或x86,单独分一个核心给信号。

出0入0汤圆

发表于 2012-5-23 23:42:32 | 显示全部楼层
做项目时,一是不要盲目上OS,要根据需求综合考虑,二是设计硬件系统时,应该充分考虑到内存方面的需求,配置充足的内存。

出0入0汤圆

发表于 2012-7-8 14:27:58 | 显示全部楼层
amsl 发表于 2010-7-30 00:12
很多场合下,上OS是很有优势的,比如GUI,使用OS会更好点,当然,如果你用裸奔也没人说啥
我觉得楼主是很值得称 ...

同感!………………

出0入0汤圆

发表于 2013-2-16 16:03:49 | 显示全部楼层
喜欢UCOS才是真的,多进程会好玩点。

出0入0汤圆

发表于 2013-2-16 16:59:24 | 显示全部楼层
想了解的人在此多谢各位了,你们继续,我多乘会凉。。。

出0入0汤圆

发表于 2013-2-16 19:00:23 | 显示全部楼层
我觉得有无OS的区别,不是OS的多任务,也不是什么文件系统。。。
而是OS将[应用程序员]与[硬件]分开
WinCE也好,Android也好,都是提供了一个人人SB都可以开发的平台。这就是楼主所谓的,内存开销大的原因。
而对于一个深度嵌入式的产品来说,有无OS是一样的,OS带来的是好处。
另外,说一句,有的OS真的只要1K,可以帮上你很大的忙。

出0入0汤圆

发表于 2013-3-7 17:27:13 | 显示全部楼层
大炮打蚊子是荒唐的,大炮打航母同样荒唐。
1K ram 的单片机用rtos有点找罪, 4G  ram的 x86用rtos也有点扯淡--极端情况不算。

出0入0汤圆

发表于 2014-2-28 15:54:41 | 显示全部楼层
过客  顶一个。。支持DIYOS

出0入0汤圆

发表于 2014-10-26 09:25:02 | 显示全部楼层
NJ8888 发表于 2009-12-3 13:02
7楼说裸奔干的事情OS也可以干太绝对,我的一个系统要信号来时处理2us脉冲串,最长连续300ms不能被打断,OS ...

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

本版积分规则

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

GMT+8, 2024-4-25 20:45

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

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