單片機(jī)和嵌入式系統(tǒng)linux的區(qū)別_第1頁
單片機(jī)和嵌入式系統(tǒng)linux的區(qū)別_第2頁
單片機(jī)和嵌入式系統(tǒng)linux的區(qū)別_第3頁
單片機(jī)和嵌入式系統(tǒng)linux的區(qū)別_第4頁
單片機(jī)和嵌入式系統(tǒng)linux的區(qū)別_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、單片機(jī)和嵌入式系統(tǒng)linux的區(qū)別 6推薦隨著嵌入式行業(yè)硬件平臺的性能增強(qiáng),項(xiàng)目需求和功能日益復(fù)雜,ARM公司推出的 CORTEX-M3,更是讓以往做單片機(jī)的工程師在芯片和技術(shù)選型面臨兩難選擇,本專題將從芯片價(jià)格、整個(gè)系統(tǒng)的硬件軟件設(shè)計(jì)及維護(hù)的成本等各個(gè)方面給您提供一個(gè)參考, 并從技術(shù)角度分析單片機(jī)和帶操作系統(tǒng)的系統(tǒng)的軟件開發(fā)的異同點(diǎn)。    1.單片機(jī)與ARM等新處理器的價(jià)格比較            2.帶操作系統(tǒng)與不帶操作系統(tǒng)的軟

2、件開發(fā)的區(qū)別            2.1.驅(qū)動開發(fā)的區(qū)別            2.2.應(yīng)用程序開發(fā)的區(qū)別1. 單片機(jī)與ARM等新處理器的價(jià)格比較表1型號架構(gòu) 資源 價(jià)格(元)AT89S518051 最高頻率33MHz4KB Flash128B內(nèi)部RAM32個(gè)可編程IO引腳 兩個(gè)16bit的計(jì)數(shù)器 一個(gè)UART口 4SST89E564RD8051 最高頻率

3、40MHz 64KB Flash1KB內(nèi)部RAM32個(gè)可編程IO引腳 三個(gè)16bit的計(jì)數(shù)器 一個(gè)UART口 一個(gè)SPI接口 35STM32F103 CORTEX-M3 最高頻率72MHz64KB或128BK Flash20KB SRAM80個(gè)可編程IO引腳 2個(gè)12bit的ADC7通道DMA控制器 標(biāo)準(zhǔn)調(diào)試口(SWD和JTAG)7個(gè)定時(shí)器 USB接口 2個(gè)I2C接口 3個(gè)UART2個(gè)SPI接口 21HI3510ARM9+DSP雙核 最高工作頻率240MHz視頻處理單元,支持多種協(xié)議的實(shí)時(shí)編解碼 圖形處理單元 視音頻接口 以太網(wǎng)接口 DDR控制器 USB、UART、IrDA、 I2C、SPI、

4、GPIO等多種外設(shè)接口 80S3C2440ARM9最高工作頻率400MHzSDRAM控制器 LCD控制器 4通道DMA控制器 3個(gè)UART2個(gè)SPI1個(gè)I2C接口 IIS音頻接口 SD HOST接口 2個(gè)USB接口 8個(gè)10bit ADC攝像頭接口 Camera接口 40 從表1里面各種芯片的資源,大概就可以猜知它們的應(yīng)用場合。51單片機(jī)通常被用來做一些比較簡單的控制,比如采集信號、驅(qū)動一些開關(guān)。AT89S51的Flash只有4K,一個(gè)稍微復(fù)雜的程序就不止4K了。SST89E564RD是一種擴(kuò)展的51單片機(jī),它的Flash達(dá)到64KB,可以外接最多64KB的SRAM。在SST89E5

5、64RD上的程序可以寫得更復(fù)雜一些,但是它對外的接口也比較少。CORTEX-M3系列的處理器,對外接口極其豐富,這使得它的應(yīng)用面更廣,但是限于它的Flash、內(nèi)存還是比較小,一般不在上面運(yùn)行操作系統(tǒng),它算是一個(gè)性能非常突出的單片機(jī)。HI3510是海思半導(dǎo)體公司的一款用于監(jiān)控設(shè)備的芯片,一般上面運(yùn)行Linux系統(tǒng),通過攝像頭采集數(shù)據(jù)、編碼,然后通過網(wǎng)絡(luò)傳輸。另一端接收到數(shù)據(jù)之后,再解碼。在上面運(yùn)行的程序非常復(fù)雜,有漂亮的圖片界面、觸摸屏控制、數(shù)據(jù)庫等等。對聲音圖像的編解碼更是用到DSP核。S3C2440是一款通用的芯片,它與“高級單片機(jī)”STM32F103相比,多了存儲控制器和NAND控制器這使

6、得可以外接更大的Flash、更大的內(nèi)存;多了內(nèi)存管理單元(MMU)這使得它可以進(jìn)行地址映身(虛擬地址、物理地址之間的映射)??梢栽赟3C2440上運(yùn)行Linux系統(tǒng),運(yùn)行更大更復(fù)雜的程序。在具體工作中,怎么選擇這些芯片呢?一句話:成本!進(jìn)行任何產(chǎn)品的開發(fā)都要考慮性價(jià)比,一切應(yīng)該從“成本”出發(fā)。成本不僅包括芯片的價(jià)格,也包括整個(gè)系統(tǒng)的硬件、軟件設(shè)計(jì)及維護(hù)的難易。芯片價(jià)格可以在電子市場問到,也可以在上找到有賣這種芯片的柜臺,然后電話咨詢?;诓煌膽?yīng)用,處理器和其他外設(shè)的選擇是要統(tǒng)一考慮的,如果要實(shí)現(xiàn)一個(gè)簡單的U盤讀寫功能,那么可以選擇帶USB控制器的CORTEX-M3芯片,也可以選擇8051外接

7、一個(gè)USB控制器比如SL811,就看哪種方案成本更低。進(jìn)行芯片選型時(shí),必須基于整個(gè)系統(tǒng)來考慮。員工的偏好和知識結(jié)構(gòu)也是一個(gè)很重要的因素,如果他對ATMEL的芯片比較熟,他就不會傾向于三星;如果他不會Linux等操作系統(tǒng),那么選型時(shí)就不會有操作系統(tǒng)的概念。選擇自己不熟悉的芯片和技術(shù),最后的成本也可能更高。2. 帶操作系統(tǒng)與不帶操作系統(tǒng)的軟件開發(fā)的區(qū)別用通俗的話來說,一個(gè)處理芯片不運(yùn)行操作系統(tǒng),我們就把它稱為單片機(jī),而單片機(jī)編程就是寫裸板程序,這個(gè)程序直接在板子上運(yùn)行;相對的,另一種程序就是基于操作系統(tǒng)的程序,說得簡單點(diǎn)就是,這種程序可以通過統(tǒng)一的接口調(diào)用“別人寫好的代碼”,在“別人的基礎(chǔ)上”更快

8、更方便地實(shí)現(xiàn)自己的功能。2.1. 驅(qū)動開發(fā)的區(qū)別驅(qū)動開發(fā)的區(qū)別我總結(jié)有兩點(diǎn):能否借用、是否通用。2.1.1 能否借用基于操作系統(tǒng)的軟件資源非常豐富,你要寫一個(gè)Linux設(shè)備驅(qū)動時(shí),首先在網(wǎng)上找找,如果有直接拿來用;其次是找到類似的,在它的基礎(chǔ)上進(jìn)行修改;如果實(shí)在沒有,就要研究設(shè)備手冊,從零寫起。而不帶操作系統(tǒng)的驅(qū)動開發(fā),一開始就要深入了解設(shè)備手冊,從零開始為它構(gòu)造運(yùn)行環(huán)境,實(shí)現(xiàn)各種函數(shù)以供應(yīng)用程序使用。 舉個(gè)例子,要驅(qū)動一塊LCD,在單片機(jī)上的做法是: 首先要了解LCD的規(guī)格,弄清楚怎么設(shè)置各個(gè)寄存器,比如設(shè)置LCD的時(shí)鐘、分辨率、象素 劃出一塊內(nèi)存給LCD使用 編寫一個(gè)函數(shù),實(shí)現(xiàn)在指定坐標(biāo)描

9、點(diǎn)。比如根據(jù)x、y坐標(biāo)在這塊內(nèi)存里找到這個(gè)象素對應(yīng)的小區(qū)域,填入數(shù)據(jù)?;诓僮飨到y(tǒng)時(shí),我們首先是找到類似的驅(qū)動,弄清楚驅(qū)動結(jié)構(gòu),找到要修改的地方進(jìn)行修改。下面是單片機(jī)操作LCD的代碼: 初始化:void Tft_Lcd_Init(int type)                       /*       

10、;          * 設(shè)置LCD控制器的控制寄存器LCDCON15                * 1. LCDCON1:                * 設(shè)置VCLK的頻

11、率:VCLK(Hz) = HCLK/(CLKVAL+1)x2                * 選擇LCD類型: TFT LCD                 * 設(shè)置顯示模式: 16BPP       &#

12、160;        * 先禁止LCD信號輸出                * 2. LCDCON2/3/4:                * 設(shè)置控制信號的時(shí)間參數(shù)  &#

13、160;             * 設(shè)置分辨率,即行數(shù)及列數(shù)                * 現(xiàn)在,可以根據(jù)公式計(jì)算出顯示器的頻率:              

14、60; * 當(dāng)HCLK=100MHz時(shí),                * Rate = 1/(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)x                *     &

15、#160;  (HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)x                *        2x(CLKVAL+1)/(HCLK)             

16、60;  *        = 60Hz                * 3. LCDCON5:                *    

17、    設(shè)置顯示模式為16BPP時(shí)的數(shù)據(jù)格式: 5:6:5                *        設(shè)置HSYNC、VSYNC脈沖的極性(這需要參考具體LCD的接口信號): 反轉(zhuǎn)           &

18、#160;    *        半字(2字節(jié))交換使能                */                LCDCON1 = (CLKVAL

19、_TFT_320240<<8) | (LCDTYPE_TFT<<5) |                                         (BPPMODE_16

20、BPP<<1) | (ENVID_DISABLE<<0);                LCDCON2 = (VBPD_320240<<24) | (LINEVAL_TFT_320240<<14) |                

21、0;                        (VFPD_320240<<6) | (VSPW_320240);                LCDCON3 = (HBPD_320

22、240<<19) | (HOZVAL_TFT_320240<<8) | (HFPD_320240);                LCDCON4 = HSPW_320240;        /        LCDCON5 = (FORMAT8BPP_5

23、65<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) |         /                               

24、60;(HWSWP<<1);                        LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | (VDEN_INV << 6) |     

25、60;                                           (HWSWP<<0);   

26、0;    /*                * 設(shè)置LCD控制器的地址寄存器LCDSADDR13                * 幀內(nèi)存與視口(view point)完全吻合,     

27、;           * 圖像數(shù)據(jù)格式如下:                *        |-PAGEWIDTH-|          

28、0;     *        y/x    0    1    2    239                *   

29、;     0    rgb rgb rgb . rgb                *        1    rgb rgb rgb . rgb      

30、0;         * 1. LCDSADDR1:                *    設(shè)置LCDBANK、LCDBASEU               

31、 * 2. LCDSADDR2:                *    設(shè)置LCDBASEL: 幀緩沖區(qū)的結(jié)束地址A21:1                * 3. LCDSADDR3:   

32、60;            *    OFFSIZE等于0,PAGEWIDTH等于(240*2/2)                */            

33、;    LCDSADDR1 = (LCDBUFFER>>22)<<21) | LOWER21BITS(LCDBUFFER>>1);                LCDSADDR2 = LOWER21BITS(LCDBUFFER+            

34、;                                 (LINEVAL_TFT_320240+1)*(HOZVAL_TFT_320240+1)*2)>>1);       &

35、#160;        LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_320240*2/2);        /* 禁止臨時(shí)調(diào)色板寄存器 */                TPAL = 0;    

36、;    fb_base_addr = LCDBUFFER;                bpp = 16;                xsize = 320;      &

37、#160;         ysize = 240;         描點(diǎn):/*         * 畫點(diǎn)        * 輸入?yún)?shù):        *   

38、     x、y : 象素坐標(biāo)        *        color: 顏色值        *                對于16BPP:

39、 color的格式為0xAARRGGBB (AA = 透明度),        *        需要轉(zhuǎn)換為5:6:5格式        *                對于8BPP: color為

40、調(diào)色板中的索引值,        *        其顏色取決于調(diào)色板中的數(shù)值        */        void PutPixel(UINT32 x, UINT32 y, UINT32 color)      

41、                  UINT8 red,green,blue;        switch (bpp)                  

42、60;     case 16:                                           &

43、#160;            UINT16 *addr = (UINT16 *)fb_base_addr + (y * xsize + x);                            

44、;    red = (color >> 19) & 0x1f;                                green = (color >> 10) & 0x3f; &

45、#160;                              blue = (color >> 3) & 0x1f;             

46、                   color = (red << 11) | (green << 5) | blue; / 格式5:6:5                    &#

47、160;           *addr = (UINT16) color;                                break; 

48、60;                                              case 8:  &#

49、160;                                                 &#

50、160;   UINT8 *addr = (UINT8 *)fb_base_addr + (y * xsize + x);                                *addr = (UINT8) color; 

51、0;                              break;                  

52、0;                     default:                           &#

53、160;    break;                        下面是在Linux的LCD驅(qū)動里修改的地方(archarmmach-s3c2440mach-smdk2440.c):        /* 320x240 */

54、60;       static struct s3c2410fb_mach_info smdk2440_lcd_cfg _initdata =                 .regs =               

55、0;         .lcdcon1 = S3C2410_LCDCON1_TFT16BPP |                                 S3C2410_LCDCON

56、1_TFT |                                 S3C2410_LCDCON1_CLKVAL(0x04),            

57、;    .lcdcon2 = S3C2410_LCDCON2_VBPD(1) |                                 S3C2410_LCDCON2_LINEVAL(239) |   

58、60;                             S3C2410_LCDCON2_VFPD(5) |                 &

59、#160;               S3C2410_LCDCON2_VSPW(1),                .lcdcon3 = S3C2410_LCDCON3_HBPD(36) |         

60、;                        S3C2410_LCDCON3_HOZVAL(319) |                      

61、;           S3C2410_LCDCON3_HFPD(19),                .lcdcon4 = S3C2410_LCDCON4_MVAL(13) |             &#

62、160;                   S3C2410_LCDCON4_HSPW(5),                .lcdcon5 = S3C2410_LCDCON5_FRM565 |    

63、60;                           S3C2410_LCDCON5_INVVLINE |                  &

64、#160;             S3C2410_LCDCON5_INVV |                                S3C

65、2410_LCDCON5_INVVDEN |                                S3C2410_LCDCON5_PWREN |          

66、60;                     S3C2410_LCDCON5_HWSWP,                ,        .gpc

67、con = 0xaaaa56aa,                .gpccon_mask = 0xffffffff,                .gpcup = 0xffffffff,       

68、60;        .gpcup_mask = 0xffffffff,        .gpdcon = 0xaaaaaaaa,                .gpdcon_mask = 0xffffffff,     

69、60;          .gpdup = 0xffffffff,                .gpdup_mask = 0xffffffff,        .fixed_syncs = 1,     &

70、#160;          .type = S3C2410_LCDCON1_TFT,                 .width = 320,                .

71、height = 240,        .xres =                         .min = 320,            

72、0;           .max = 320,                        .defval = 320,          

73、60;     ,        .yres =                         .max = 240,         &

74、#160;              .min = 240,                        .defval = 240,       

75、         ,        .bpp =                         .min = 16,      

76、                  .max = 16,                        .defval = 16,    &

77、#160;           ,        這并不表示代碼Linux的驅(qū)動程序就比單片機(jī)的驅(qū)動程序好寫,怎么在幾萬個(gè)文件中找到要修改的代碼,這也是需要艱苦的學(xué)習(xí)的?;诓僮飨到y(tǒng)的驅(qū)動開發(fā),既要懂得芯片的具體操作,也要理解操作系統(tǒng)的軟件結(jié)構(gòu)。2.1.2 是否通用有些單片機(jī)廠家也給客戶提供了大量的驅(qū)動程序,比如USB HOST驅(qū)動程序,這可以讓客戶很容易就可以在它的上面編寫程序讀寫U盤。但是客戶寫的這些程

78、序,只能在這種芯片、這個(gè)驅(qū)動程序上使用;更換另一種芯片后,即使芯片公司也提供了驅(qū)動程序,但是接口絕對不一樣,客戶又得重新編寫應(yīng)用程序?;诓僮飨到y(tǒng)的驅(qū)動程序要遵循統(tǒng)一的接口,比如對于不同的芯片的USB HOST驅(qū)動,它們都要向上提供一個(gè)相同的數(shù)據(jù)結(jié)構(gòu),在里面實(shí)現(xiàn)了各自的USB操作。下面是S3C2410/S3C2440的USB驅(qū)動向上層提供的數(shù)據(jù)結(jié)構(gòu):static const struct hc_driver ohci_s3c2410_hc_driver =            

79、60;    .deion = hcd_name,                .product_desc = "S3C24XX OHCI",                .hcd_priv_size = sizeo

80、f(struct ohci_hcd),        /*                * generic hardware linkage                */  

81、;              .irq = ohci_irq,                .flags = HCD_USB11 | HCD_MEMORY,        /*   

82、60;            * basic lifecycle operations                */                .st

83、art = ohci_s3c2410_start,                .stop = ohci_stop,                .shutdown = ohci_shutdown,      

84、60; /*                * managing i/o requests and associated device resources                */      

85、0;         .urb_enqueue = ohci_urb_enqueue,                .urb_dequeue = ohci_urb_dequeue,              

86、  .endpoint_disable = ohci_endpoint_disable,        /*                * scheduling support             &#

87、160;  */                .get_number = ohci_get_,        /*                * root hub suppo

88、rt                */                .hub_status_data = ohci_s3c2410_hub_status_data,         &#

89、160;      .hub_control = ohci_s3c2410_hub_control,                .hub_irq_enable = ohci_rhsc_enable,        #ifdef CONFIG_PM    &

90、#160;           .bus_suspend = ohci_bus_suspend,                .bus_resume = ohci_bus_resume,        #endif   

91、;             .start_port_reset = ohci_start_port_reset,        下面是ATMEL公司的ARM芯片的USB驅(qū)動向上層提供的數(shù)據(jù)結(jié)構(gòu):/*-*/static const struct hc_driver ohci_at91_hc_driver =        

92、;         .deion = hcd_name,                .product_desc = "AT91 OHCI",               

93、60;.hcd_priv_size = sizeof(struct ohci_hcd),        /*                * generic hardware linkage              

94、  */                .irq = ohci_irq,                .flags = HCD_USB11 | HCD_MEMORY,       

95、0;/*                * basic lifecycle operations                */            &#

96、160;   .start = ohci_at91_start,                .stop = ohci_stop,                .shutdown = ohci_shutdown,   

97、;     /*                * managing i/o requests and associated device resources                */   

98、             .urb_enqueue = ohci_urb_enqueue,                .urb_dequeue = ohci_urb_dequeue,          &#

99、160;     .endpoint_disable = ohci_endpoint_disable,        /*                * scheduling support         

100、0;      */                .get_number = ohci_get_,        /*               

101、 * root hub support                */                .hub_status_data = ohci_hub_status_data,       

102、         .hub_control = ohci_hub_control,                .hub_irq_enable = ohci_rhsc_enable,        #ifdef CONFIG_PM   &

103、#160;            .bus_suspend = ohci_bus_suspend,                .bus_resume = ohci_bus_resume,        #endif  

104、;              .start_port_reset = ohci_start_port_reset,        基于通用性,即使是你自己寫的Linux驅(qū)動,簡單到只是點(diǎn)亮一個(gè)LED,基于“通用性”,這個(gè)驅(qū)動也要向上提供統(tǒng)一的接口。下面是單片機(jī)LED驅(qū)動程序和Linux下的LED驅(qū)動程序的部分代碼。單片機(jī)LED驅(qū)動程序:void led_init(void)&#

105、160;                       GPBCON = GPB5_out; / 將LED對應(yīng)的GPB5引腳設(shè)為輸出        void led_on(void)          

106、               GPBDAT &= (1<<5);        void led_off(void)                    &#

107、160;    GPBDAT |= (1<<5);        Linux的LED驅(qū)動程序:        #define DEVICE_NAME "leds" /* 加載模式后,執(zhí)行”cat /proc/devices”命令看到的設(shè)備名稱 */        #define LED_

108、MAJOR 231 /* 主設(shè)備號 */* 應(yīng)用程序執(zhí)行ioctl(fd, cmd, arg)時(shí)的第2個(gè)參數(shù) */        #define IOCTL_LED_ON 0        #define IOCTL_LED_OFF 1/* 用來指定LED所用的GPIO引腳 */        static unsigned long led_table =

109、                 S3C2410_GPB5,                S3C2410_GPB6,             

110、60;  S3C2410_GPB7,                S3C2410_GPB8,        /* 用來指定GPIO引腳的功能:輸出 */        static unsigned int led_cfg_table =  

111、60;              S3C2410_GPB5_OUTP,                S3C2410_GPB6_OUTP,             

112、60;  S3C2410_GPB7_OUTP,                S3C2410_GPB8_OUTP,        /* 應(yīng)用程序?qū)υO(shè)備文件/dev/leds執(zhí)行open(.)時(shí),        * 就會調(diào)用s3c24xx_leds_open函數(shù)

113、        */        static int s3c24xx_leds_open(struct inode *inode, struct file *file)                      &#

114、160; int i;                for (i = 0; i < 4; i+)                         / 設(shè)置GPIO引腳的功能:本驅(qū)動中

115、LED所涉及的GPIO引腳設(shè)為輸出功能                        s3c2410_gpio_cfgpin(led_tablei, led_cfg_tablei);               

116、;                 return 0;        /* 應(yīng)用程序?qū)υO(shè)備文件/dev/leds執(zhí)行ioclt(.)時(shí),        * 就會調(diào)用s3c24xx_leds_ioctl函數(shù)     

117、60;  */        static int s3c24xx_leds_ioctl(                struct inode *inode,               

118、0; struct file *file,                 unsigned int cmd,                 unsigned long arg)       

119、60;                if (arg > 4)                         return -EINVAL;    &#

120、160;                           switch(cmd)                 case IOCTL_LED_ON: &#

121、160;                      / 設(shè)置指定引腳的輸出電平為0                        s3c24

122、10_gpio_setpin(led_tablearg, 0);                        return 0;        case IOCTL_LED_OFF:        

123、                / 設(shè)置指定引腳的輸出電平為1                        s3c2410_gpio_setpin(led_tablearg, 1); &#

124、160;                      return 0;        default:                        return -EINVAL;                        /*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論