搜索
bottom↓
回复: 19

请问:在IAR中如何定义在FLASH中的变量?

[复制链接]

出0入0汤圆

发表于 2005-10-18 18:51:40 | 显示全部楼层 |阅读模式
我试过在前面加FLASH,编译不过去,是不是要加个特定的H文件或需要什么设置?



另外我用CONST定义的变量会放在哪啊?

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2005-10-18 20:35:01 | 显示全部楼层
CONST定义的变量会放在FLASH和ram中。

使用下面这个加FLASH,就可以编译过去。



/*

********************************************************************************************

头部文件名:        MCU_C_Macro_Data_Define.h

头部文件名称:      嵌入式微处理器C程序的数据类型和常用指令宏定义的头部文件

适用器件芯片类型:   嵌入式微处理器

文件版本:        1.0

文件功能:

    本文件是对嵌入式微处理器C程序的数据类型、在编程中一些常用操作和指令及位操作进行

  宏定义的头部文件。

文件说明:

    在使用本文件前,必须首先使用全局预定义字符来对C编译系统进行定义!

    对各种C编译系统规定使用的全局预定义字符如下(中括号里面的字符):

    ①.IAR Embedded Workbench for Atmel AVR ------ [_IAR_EW_AVR_]

    ②.ICCAVR ------------------------------------ [_ICC_AVR_]

    ③.CodeVision AVR ---------------------------- [_CodeVision_AVR_]

编译工具软件:

链接文件:



编作者:            

编作者 E-Mail:     PTZSW@163.COM

编制日期:          2005年8月18日

----------------------------------------------------------------------------------------

头部文件版本历史:

2005年8月18日 -------- 版本 1.0 :发行版本

********************************************************************************************

*/



/*==========================================================================================

下面两条指令是本头部文件条件编译的预处理指令,用于防止本头部文件被其他文件重复引用。

==========================================================================================*/

#ifndef MCU_C_MACRO_DATA_DEFINE_H             // "MCU_C_MACRO_DATA_DEFINE_H" 条件编译开始

#define MCU_C_MACRO_DATA_DEFINE_H



/*==========================================================================================

下面这三条指令是用于区分编译系统为 C++ 或 C 的预处理指令。

"__cplusplus" 为 C++ 预处理器名字,这三条指令表明接在其下面的那些指令为 C 程序特征。

==========================================================================================*/

#ifdef __cplusplus

extern "C" {

#endif







/*==========================================================================================

定义系统处理的数据位字长度大小:

==========================================================================================*/

#define SYSDATA_BITNUM        8               // 定义系统数据位的字长数





/*==========================================================================================

为了做到较好的软件可移植性,推荐用户在编程时使用下面定义的数据类型大小

==========================================================================================*/

typedef unsigned char         BOOLEAN;        // 定义【布尔(逻辑)】数据类型



typedef char                  char8;          // char8   代表【有符号字符】数据类型

typedef unsigned char         Uchar8;         // Uchar8  代表【无符号字符】数据类型

typedef int                   int16;          // int16   代表【有符号整数】数据类型

typedef unsigned int          Uint16;         // Uint16  代表【无符号整数】数据类型

typedef long int              int32;          // int32   代表【有符号长整数】数据类型

typedef unsigned long int     Uint32;         // Uint32  代表【无符号长整数】数据类型

typedef float                 float32;        // float32 代表【单精度浮点数】数据类型



/*==========================================================================================

位操作定义(用于变量中某一位的直接置位/清除位),推荐置位/清除位的语句为:

①.变量名称 |= BITn;       置位操作(将变量与下面的位定义值进行按位或运算)

②.变量名称 &= ~BITn;      清除位操作(将变量与下面的位定义值的非值进行按位与运算)

==========================================================================================*/

#define BIT0                  0x01            // BIT0  = (1<<1)  = 0b00000001

#define BIT1                  0x02            // BIT1  = (1<<2)  = 0b00000010

#define BIT2                  0x04            // BIT2  = (1<<3)  = 0b00000100

#define BIT3                  0x08            // BIT3  = (1<<4)  = 0b00001000

#define BIT4                  0x10            // BIT4  = (1<<5)  = 0b00010000

#define BIT5                  0x20            // BIT5  = (1<<6)  = 0b00100000

#define BIT6                  0x40            // BIT6  = (1<<7)  = 0b01000000

#define BIT7                  0x80            // BIT7  = (1<<8)  = 0b10000000



#define BIT_HIGH              BIT7            // BIT7  = (1<<8)  = 0b10000000

#define BIT_LOW               BIT0            // BIT0  = (1<<1)  = 0b00000001







/*

********************************************************************************************

                             AVR单片机常用操作和指令宏的定义

********************************************************************************************

*/

/*--------------------------------------------------------------------------------------

位操作指令的宏定义:

①.对存储在地址中的数据变量执行置位操作指令:  SET_BIT(ADDRESS,BIT)

②.对存储在地址中的数据变量执行清位操作指令:  CLEAR_BIT(ADDRESS,BIT)

③.测试存储在地址中的数据变量某一位数值的指令:TEST_BIT(ADDRESS,BIT)

    其中:ADDRESS ----- 变量存储地址

          BIT --------- 位数(阿拉伯数字)

--------------------------------------------------------------------------------------*/

#if defined(_IAR_EW_AVR_) || defined(_ICC_AVR_) || defined(_CodeVision_AVR_)

#define SET_BIT(ADDRESS,BIT)    ((ADDRESS) |= (1<<(BIT)))

#define CLEAR_BIT(ADDRESS,BIT)  ((ADDRESS) &= ~(1<<(BIT)))

#define TEST_BIT(ADDRESS,BIT)   ((ADDRESS) & (1<<(BIT)))

#endif



/*--------------------------------------------------------------------------------------

IAR Embedded Workbench for AVR 编译器对16位的寄存器进行读写操作指令的宏定义:

①.对16位的寄存器进行写入的操作指令:OUT_WORD(ADDRESS,VAL)

②.读取16位的寄存器中内容的操作指令:IN_WORD(ADDRESS,VAL)

    其中:ADDRESS ----- 寄存器的存储地址

          VAL --------- 位数(阿拉伯数字)

--------------------------------------------------------------------------------------*/

#if defined(_IAR_EW_AVR_)                     // "IAR Embedded Workbench AVR " 条件编译开始

#define OUT_WORD(ADDRESS,VAL)  \

{\

  __disable_interrupt();\

  (ADDRESS) = (VAL);\

  __enable_interrupt();\

}



#define IN_WORD(ADDRESS,VAL)  \

{\

  __disable_interrupt();\

  (VAL) = (ADDRESS);\

  __enable_interrupt();\

}

#endif                                        // "defined(_IAR_EW_AVR_)" 条件编译结束







/*--------------------------------------------------------------------------------------

在编程中一些常用操作和指令宏的定义:

①.WDR()        -------- 看门狗定时器复位指令

②.SEI()        -------- 使能全局中断指令

③.CLI()        -------- 禁止全局中断指令

④.SLEEP()        ------ MCU进入休眠状态指令

⑤.NOP()        -------- 空操作指令

--------------------------------------------------------------------------------------*/

#if defined(_IAR_EW_AVR_) || defined(_ICC_AVR_) || defined(_CodeVision_AVR_)

#define WDR()    asm("wdr")                   // 看门狗定时器复位

#define SEI()           asm("sei")                   // 使能全局中断

#define CLI()           asm("cli")                   // 禁止全局中断

#define SLEEP()         asm("sleep")                 // MCU进入休眠状态

#define NOP()           asm("nop")                   // 空操作

#endif







/*--------------------------------------------------------------------------------------

EEPROM存储器扩展的操作和指令宏的定义:

①.eeprom ----------------------------- 指向 EEPROM 存储器的关键字

②.EEPROM_WRITE(ADDRESS, DATA) -------- 写入数据到 EEPROM 存储器中某一个具体地址的指令

③.EEPROM_READ(DATA, ADDRESS) --------- 从 EEPROM 存储器中某一个具体地址读取数据的指令

    其中:ADDRESS --------- 访问 EEPROM 存储器的具体地址

          DATA ------------ 对 EEPROM 存储器执行操作的数据

--------------------------------------------------------------------------------------*/

#if defined(_IAR_EW_AVR_)                     // "IAR Embedded Workbench AVR " 条件编译开始

#define eeprom                      __eeprom  // 定义指向 EEPROM 存储器的关键字



#ifndef EEPROM_WRITE

#define EEPROM_WRITE(ADDRESS, DATA) __EEPUT(ADDRESS, DATA)

#endif



#ifndef EEPROM_READ

#define EEPROM_READ(DATA, ADDRESS)  __EEGET(DATA, ADDRESS)

#endif



#ifndef _EEPUT

#define _EEPUT(V,A)                 __EEPUT(V,A)

#endif



#ifndef _EEGET

#define _EEGET(V,A)                 __EEGET(V,A)

#endif



#ifdef __HAS_EEPROM__                         // "__HAS_EEPROM__"条件编译开始

#define __EEPUT(ADDRESS, DATA)      (*((unsigned char __eeprom *)ADDRESS) = DATA)

#define __EEGET(DATA, ADDRESS)      (DATA = *((unsigned char __eeprom *)ADDRESS))

#else

#define __EEPUT(ADDRESS, DATA)      {                        \

                                       while (EECR & 0x02);  \

                                       EEAR = (ADDRESS);     \

                                       EEDR = (DATA);        \

                                       EECR = 0x04;          \

                                       EECR = 0x02;          \

                                    }



#define __EEGET(DATA, ADDRESS)      {                        \

                                       while (EECR & 0x02);  \

                                       EEAR = (ADDRESS);     \

                                       EECR = 0x01;          \

                                       (DATA) = EEDR;        \

                                     }

#endif                                        // "__HAS_EEPROM__" 条件编译结束

#endif                                        // "defined(_IAR_EW_AVR_)" 条件编译结束





#if defined(_CodeVision_AVR_)                 // "CodeVision AVR 编译器"条件编译开始

#define EEPROM_WRITE(ADDRESS, DATA) (eeprom *((volatile unsigned char *)ADDRESS) = DATA)

#define EEPROM_READ(DATA, ADDRESS)  (DATA = eeprom *((volatile unsigned char *)ADDRESS))

#endif                                        // "_CodeVision_AVR_" 条件编译结束





#if defined(_ICC_AVR_)                        // "ICC AVR 编译器"条件编译开始



#endif                                        // "_ICC_AVR_" 条件编译结束





/*

********************************************************************************************

AVR单片机各编译系统的字符不同而操作功能相同的扩展关键字,为彼此之间相至兼容而定义的宏字符

********************************************************************************************

*/

/*==========================================================================================

IAR Embedded Workbench for AVR 头部文件“comp_a90.h”中的兼容性宏定义

==========================================================================================*/

#if defined(_IAR_EW_AVR_)                     // "IAR Embedded Workbench AVR " 条件编译开始



#ifndef __COMP_A90_H                          // "__COMP_A90_H" 条件编译开始

#define __COMP_A90_H



#define tiny                  __tiny

#define near                  __near

#define far                   __far

#define huge                  __huge



#define flash                 const __flash

#define farflash              const __farflash



#define nearfunc              __nearfunc

#define farfunc               __farfunc



#define sfrb                  int int int Cannot use sfrb keyword in iccAVR;

#define sfrw                  int int int Cannot use sfrw keyword in iccAVR;



#define monitor               __monitor

#define C_task                __C_task

#define no_init               __no_init



#ifndef _CLI

#define _CLI()                __disable_interrupt()

#endif



#ifndef disable_interrupt

#define disable_interrupt()   __disable_interrupt()

#endif



#ifndef _SEI

#define _SEI()                __enable_interrupt()

#endif



#ifndef enable_interrupt

#define enable_interrupt()    __enable_interrupt()

#endif



#ifndef _NOP

#define _NOP()                __no_operation()

#endif



#ifndef _SLEEP

#define _SLEEP()              __sleep()

#endif



#ifndef _LPM

#define _LPM(ADDR)            __load_program_memory(ADDR)

#endif



#ifdef __HAS_ELPM__

#ifndef _ELPM

#define _ELPM(ADDR)           __extended_load_program_memory(ADDR)

#endif

#endif



#ifndef _WDR

#define _WDR()                __watchdog_reset()

#endif



#ifndef _OPC

#define _OPC(opCode)          __insert_opcode(opCode)

#endif



#endif                                        // "__COMP_A90_H" 条件编译结束



#endif                                        // "defined(_IAR_EW_AVR_)" 条件编译结束





/*==========================================================================================

IAR Embedded Workbench for AVR 头部文件“INAVR.H”中的兼容性宏定义

==========================================================================================*/

#if defined(_IAR_EW_AVR_)                     // "IAR Embedded Workbench AVR " 条件编译开始



#ifndef __INAVR_H                             // "__INAVR_H" 条件编译开始

#define __INAVR_H



__intrinsic void              __no_operation(void);

__intrinsic void              __enable_interrupt(void);

__intrinsic void              __disable_interrupt(void);

__intrinsic void              __sleep(void);

__intrinsic void              __watchdog_reset(void);



#define __clear_watchdog_timer()  __watchdog_reset()



#pragma language=extended

__intrinsic unsigned char   __load_program_memory(const unsigned char __flash *);

#ifdef __HAS_ELPM__

__intrinsic unsigned char __extended_load_program_memory(const unsigned char __farflash *);

#endif

#pragma language=default



__intrinsic void              __insert_opcode(unsigned short op);



#if __MEMORY_MODEL__ == 4

#if __CPU__ < 2

#define __STR_MATTR__ __flash

#else

#define __STR_MATTR__ __hugeflash

#endif

#else

#define __STR_MATTR__

#endif





__intrinsic void __require(void *);



__intrinsic void              __delay_cycles(unsigned long);



__intrinsic unsigned char     __save_interrupt(void);

#define __get_interrupt_state() __save_interrupt()



__intrinsic void              __restore_interrupt(unsigned char);

#define __set_interrupt_state(STATE) __restore_interrupt(STATE)



__intrinsic unsigned char     __swap_nibbles(unsigned char);



__intrinsic void              __indirect_jump_to(unsigned long);





/*--------------------------------------------------------------------------------------

增强型核心指令集的内在函数定义

--------------------------------------------------------------------------------------*/

#ifdef __HAS_ENHANCED_CORE__



#ifdef __HAS_MUL__

__intrinsic unsigned int  __multiply_unsigned(unsigned char, unsigned char);

__intrinsic signed int    __multiply_signed(signed char, signed char);

__intrinsic signed int    __multiply_signed_with_unsigned(signed char, unsigned char);



__intrinsic unsigned int  __fractional_multiply_unsigned(unsigned char, unsigned char);

__intrinsic signed int    __fractional_multiply_signed(signed char, signed char);

__intrinsic signed int    __fractional_multiply_signed_with_unsigned(signed char, signed char);

#endif



#pragma language=extended



/* SPM */

__intrinsic void          __DataToR0ByteToSPMCR_SPM(unsigned char data,

                                                    unsigned char byte);

__intrinsic void          __AddrToZByteToSPMCR_SPM(void __flash* addr,

                                                   unsigned char byte);

__intrinsic void          __AddrToZWordToR1R0ByteToSPMCR_SPM(void __flash* addr,

                                                             unsigned short word,

                                                             unsigned char byte);



#define _SPM_LOCKBITS(Data)   __DataToR0ByteToSPMCR_SPM((Data), 0x09)



#define _SPM_ERASE(Addr)      __AddrToZByteToSPMCR_SPM((void __flash*)(Addr), 0x03)



#define _SPM_FILLTEMP(Addr,Data)  \

        __AddrToZWordToR1R0ByteToSPMCR_SPM((void __flash*)(Addr), (Data), 0x01)



#define _SPM_PAGEWRITE(Addr)  __AddrToZByteToSPMCR_SPM((void __flash*)(Addr), (0x05))





__intrinsic unsigned char     __AddrToZByteToSPMCR_LPM(void __flash* addr,

                                                       unsigned char byte);



#define _SPM_GET_LOCKBITS()   __AddrToZByteToSPMCR_LPM((void __flash*)0x0001, 0x09)



#define _SPM_GET_FUSEBITS()   __AddrToZByteToSPMCR_LPM((void __flash*)0x0000, 0x09)





#ifdef __HAS_ELPM__

__intrinsic void              __AddrToZ24ByteToSPMCR_SPM(void __farflash* addr,

                                                         unsigned char byte);

__intrinsic void              __AddrToZ24WordToR1R0ByteToSPMCR_SPM(void __farflash* addr,

                                                                   unsigned short word,

                                                                   unsigned char byte);

#define _SPM_24_ERASE(Addr)   __AddrToZ24ByteToSPMCR_SPM((void __farflash*)(Addr), 0x03)



#define _SPM_24_FILLTEMP(Addr,Data)  \

        __AddrToZ24WordToR1R0ByteToSPMCR_SPM((void __farflash*)(Addr), (Data), 0x01)



#define _SPM_24_PAGEWRITE(Addr) __AddrToZ24ByteToSPMCR_SPM((void __farflash*)(Addr), (0x05))



__intrinsic unsigned char     __AddrToZ24ByteToSPMCR_ELPM(void __farflash* addr,

                                                          unsigned char byte);

#endif

#pragma language=default



#endif //__HAS_ENHANCED_CORE__





/* PORT is a sfrb defined variable */

#define input(PORT) (PORT)

#define output(PORT,VAL) ((PORT)=(VAL))



#define input_block_dec(PORT,ADDRESS,COUNT)\

{ \

  unsigned char i;\

  unsigned char *addr=(ADDRESS);\

  for(i=0;i<(COUNT);i++)\

    *addr--=(PORT);\

}



#define input_block_inc(PORT,ADDRESS,COUNT)\

{ \

  unsigned char i;\

  unsigned char *addr=(ADDRESS);\

  for(i=0;i<(COUNT);i++)\

    *addr++=(PORT);\

}



#define output_block_dec(PORT,ADDRESS,COUNT)\

{ \

  unsigned char i;\

  unsigned char *addr=(ADDRESS);\

  for(i=0;i<(COUNT);i++)\

    (PORT)=*addr--;\

}



#define output_block_inc(PORT,ADDRESS,COUNT)\

{ \

  unsigned char i;\

  unsigned char *addr=(ADDRESS);\

  for(i=0;i<(COUNT);i++)\

    (PORT)=*addr++;\

}



/*--------------------------------------------------------------------------------------

一些常用的宏定义

--------------------------------------------------------------------------------------*/

#define __out_word(BaseName, value)\

{\

  unsigned char _tH=(value) >>   8;\

  unsigned char _tL=(value) & 0xFF;\

  BaseName ## H = _tH;\

  BaseName ## L = _tL;\

}





#define __out_word_atomic(BaseName, value)\

{\

unsigned char _t=__save_interrupt();\

__disable_interrupt();\

__out_word(BaseName,value);\

__restore_interrupt(_t);\

}



#define __in_word(BaseName, value)\

{\

(value) = (BaseName ## L);\

(value) |= (unsigned short)BaseName ## H << 8;\

}





#define __in_word_atomic(BaseName, value)\

{\

unsigned char _t=__save_interrupt();\

__disable_interrupt();\

__in_word(BaseName, value);\

__restore_interrupt(_t);\

}



#endif                                        // "__INAVR_H" 条件编译结束



#endif                                        // "defined(_IAR_EW_AVR_)" 条件编译结束







/*==========================================================================================

下面这三条指令是用于与上面三条区分编译系统为 C++ 或 C 的预处理指令相对应。用于指定

extern "C" 链接指示符作用域,此处的"}"与上面的"{"相对应,为链接指示符作用结束符。

==========================================================================================*/

#ifdef __cplusplus

}

#endif



#endif                                        // "MCU_C_MACRO_DATA_DEFINE_H" 条件编译结束







/*

********************************************************************************************

                                     本头部文件到此结束

********************************************************************************************

*/

出0入0汤圆

 楼主| 发表于 2005-10-19 09:28:17 | 显示全部楼层
????

这么复杂。

在IAR编译器中没有指定常量放在FLASH的指令?

出0入0汤圆

发表于 2005-10-19 13:03:02 | 显示全部楼层
__flash unsigned char table_code[]={

0xc0,        //0

0xf9,        //1

0xa4,        //2

0xb0,        //3

0x99,        //4

0x92,        //5

0x82,        //6

0xf8,        //7

0x80,        //8

0x90,        //9

};



注意flash前有两条下划线!

出0入0汤圆

 楼主| 发表于 2005-10-19 17:54:07 | 显示全部楼层
我试过,楼上这样是可以的。但如果是指针就不一样了。



如定义成:



__flash char * abc = "test";



__flash char * __flash abc = "test";



__flash char __ flash * abc = "test";  //这条系统报错。



char __flash * abc = "test"   //提示不能对char__flash类型初始化。



最后执行后,没有哪一条在DATA区的空间是0的。都占用了DATA空间。也就是说变量在DATA区。

出0入0汤圆

发表于 2005-10-20 09:30:21 | 显示全部楼层
我的C语言水平很差,不知道楼上的几条语句有啥用?

大大小小的单片机程序写了不少,但还没用到过这样的语句,能不能向我解释一下实现什么样的功能要用到上面的语句?

出0入0汤圆

发表于 2005-10-20 10:49:07 | 显示全部楼层
flash   里面 能 弄 变量 吗???  常量 还差不多 吧~!

变量怎么改变值啊?

出0入0汤圆

 楼主| 发表于 2005-10-20 11:08:22 | 显示全部楼层
对对对,就是常量。在FLASH中的。在定义的时候初始化内容。

出0入0汤圆

发表于 2005-10-20 11:46:03 | 显示全部楼层
楼主是常量就用: const __flash 关键词。

你上面的那些定义我水平差,真看不懂。

给你看的那个头文件,有一条定义:

#define flash                 const __flash

就是用 flash 词来代替这个关键词,因为在其他编译器中用 flash 关键词来将常量定义到flash存储器中。

出0入0汤圆

发表于 2006-12-2 16:57:49 | 显示全部楼层
__AddrToZByteToSPMCR_SPM

这个是在哪儿定义的?是IAR专有的吧?

什么作用?

出0入0汤圆

发表于 2006-12-4 11:01:52 | 显示全部楼层
to 9楼 好像是 专用的。有使用的例子吗

出0入0汤圆

发表于 2007-1-3 00:37:06 | 显示全部楼层
iar编译器说明文档中所述:



int a; A variable defined in default memory.

int __flash b; A variable in flash memory.

__eeprom int c; A variable in eeprom memory.

int * d; A pointer stored in default memory. The pointer

points to an integer in default memory.

int __flash * e; A pointer stored in default memory. The pointer

points to an integer in flash memory.

int __flash * __eeprom f; A pointer stored in eeprom memory pointing to

an integer stored in flash memory.

int __eeprom * myFunction(

int __flash *);

A declaration of a function that takes a

parameter which is a pointer to an integer stored

in flash memory. The function returns a pointer

to an integer stored in eeprom memory.

出0入0汤圆

发表于 2007-1-11 08:57:20 | 显示全部楼层
请各位大侠指点:  

一 IRA 程序向 GCC 移植时, 一个寄存器变量声明, 一个 EEPROM 变量声明,   

一个中断向量的处理出错. 请高手指点!!!!!!!  



Thanks!!  





IAR:  

__regvar __no_init volatile unsigned int filteredTimeSinceCommutation @14;  

GCC:  

register volatile unsigned int filteredTimeSinceCommutation _attribute_((section(".@12")));  

report: ERROR  







IAR:  

  __eeprom unsigned static int restartAttempts;  

GCC:  

unsigned static int restartAttempts _attribute_((section(".eeprom")));  

report: ERROR   



   



IAR:   

#pragma vector=TIMER0_OVF_vect  

__interrupt void MotorPWMBottom()  

{  

  unsigned char temp;  

...........  

...........  

}  

GCC:  

SIGNAL(TIMER0_OVF_vect)  

{  

  unsigned char temp;  

...........  

...........  

}  

report: SINGAL re-identify  

因还有其它中断使用SINGAL中断名, 如: SIGNAL(ADC_vect)

出0入0汤圆

发表于 2007-3-20 09:54:38 | 显示全部楼层
我现在正在学习使用IAR,2楼的程序确实让我很受用,先谢了。

出0入0汤圆

发表于 2008-6-16 09:22:56 | 显示全部楼层
学习,谢谢

出0入0汤圆

发表于 2009-10-5 12:10:12 | 显示全部楼层
高手~~mark

出0入0汤圆

发表于 2010-5-10 13:44:09 | 显示全部楼层
受用 谢谢

出0入0汤圆

发表于 2011-4-12 16:37:01 | 显示全部楼层
支持

出0入0汤圆

发表于 2011-10-21 14:53:07 | 显示全部楼层
mark

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 22:40

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

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