驅動06.觸摸屏驅動程序

1.觸摸屏的簡介

  觸摸屏是標準的輸入設備,在寫驅動程序時采用的之前講過的輸入子系統那套框架。我們無需關心對設備文件的操作,只需關心對硬件寄存器的操作和上報事件即可。

  觸摸屏是附在LCD上的一層薄膜,并不是我們平時認識的觸摸屏,它只是起到確定坐標的作用。

?? S3C2440提供的觸摸屏接口有4種處理模式,分別是:正常轉換模式、單獨的X/Y位置轉換模式、自動X/Y位置轉換模式和等待中斷模式。本例子中用的是等待中斷模式

2.以s3c2410_ts.c為例分析整體框架

2.1 s3c2410ts_init函數

1 static int __init s3c2410ts_init(void)
2 {
3 //    init_MUTEX(&gADClock);
4     return platform_driver_register(&s3c2410ts_driver);/*注冊s3c2410ts_driver*/
5 }
1 static struct platform_driver s3c2410ts_driver = {
2        .driver         = {
3            .name   = "s3c2410-ts",
4            .owner  = THIS_MODULE,
5        },
6        .probe          = s3c2410ts_probe,
7        .remove         = s3c2410ts_remove,
8 };

如果出現與其同名的平臺設備,將調用其probe函數

2.2 s3c2410ts_probe函數

static int __init s3c2410ts_probe(struct platform_device *pdev)
{    /*使能adc時鐘*/adc_clock = clk_get(NULL, "adc");clk_enable(adc_clock);//映射adc的地址base_addr=ioremap(S3C2410_PA_ADC,0x20);//配置GPIO,初始化
    s3c2410_ts_connect();//分配一個input_dev結構體input_dev = input_allocate_device();//設置這個結構體ts.dev = input_dev;//事件類型:按鍵類、絕對位移類ts.dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);ts.dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);//絕對位移類的各種參數:X方向、Y方向、按壓類input_set_abs_params(ts.dev, ABS_X, 0, 0x3FF, 0, 0);input_set_abs_params(ts.dev, ABS_Y, 0, 0x3FF, 0, 0);input_set_abs_params(ts.dev, ABS_PRESSURE, 0, 1, 0, 0);request_irq(IRQ_ADC,stylus_action,...);//ADC中斷request_irq(IRQ_TC,stylus_updown,...);//觸摸屏中斷//注冊input_dev結構體
    input_register_device(ts.dev);}

2.3 ADC中斷處理函數stylus_action

static irqreturn_t stylus_action(int irq, void *dev_id)
{unsigned long data0;unsigned long data1;//    if (bADCForTS) {
    data0 = ioread32(base_addr+S3C2410_ADCDAT0);data1 = ioread32(base_addr+S3C2410_ADCDAT1);ts.xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;ts.yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;ts.count++;//        bADCForTS = 0;
//        up(&gADClock);if (ts.count < (1<<ts.shift)) {
//                if (!down_trylock(&gADClock)) {
//                    bADCForTS = 1;iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);
//            }} else {mod_timer(&touch_timer, jiffies+1);iowrite32(WAIT4INT(1), base_addr+S3C2410_ADCTSC);}
//    }return IRQ_HANDLED;
}

2.4 觸摸屏中斷處理函數stylus_updown

 1 static irqreturn_t stylus_updown(int irq, void *dev_id)
 2 {
 3     unsigned long data0;
 4     unsigned long data1;
 5     int updown;
 6 
 7     data0 = ioread32(base_addr+S3C2410_ADCDAT0);
 8     data1 = ioread32(base_addr+S3C2410_ADCDAT1);
 9 
10     updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
11 
12     /* TODO we should never get an interrupt with updown set while
13      * the timer is running, but maybe we ought to verify that the
14      * timer isn't running anyways. */
15 
16     if (updown)
17         touch_timer_fire(0);
18 
19     return IRQ_HANDLED;
20 }
 1 static void touch_timer_fire(unsigned long data) //上報事件
 2 {
 3       unsigned long data0;
 4       unsigned long data1;
 5     int updown;
 6 
 7       data0 = ioread32(base_addr+S3C2410_ADCDAT0);
 8       data1 = ioread32(base_addr+S3C2410_ADCDAT1);
 9 
10      updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
11 
12      if (updown) {
13          if (ts.count != 0) {
14             long tmp;  
15 
16             tmp = ts.xp;
17             ts.xp = ts.yp;
18             ts.yp = tmp;
19 
20              ts.xp >>= ts.shift;
21              ts.yp >>= ts.shift;
22 
23 #ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
24              {
25                  struct timeval tv;
26                  do_gettimeofday(&tv);
27                  printk(DEBUG_LVL "T: %06d, X: %03ld, Y: %03ld\n", (int)tv.tv_usec, ts.xp, ts.yp);
28              }
29 #endif
30 
31              input_report_abs(ts.dev, ABS_X, ts.xp);
32              input_report_abs(ts.dev, ABS_Y, ts.yp);
33 
34              input_report_key(ts.dev, BTN_TOUCH, 1);
35              input_report_abs(ts.dev, ABS_PRESSURE, 1);
36              input_sync(ts.dev);
37          }
38 
39          ts.xp = 0;
40          ts.yp = 0;
41          ts.count = 0;
42 
43 //        if (!down_trylock(&gADClock)) {
44 //            bADCForTS = 1;
45           iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);
46           iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);
47 //      }
48      } else {
49          ts.count = 0;
50 
51          input_report_key(ts.dev, BTN_TOUCH, 0);
52          input_report_abs(ts.dev, ABS_PRESSURE, 0);
53          input_sync(ts.dev);
54 
55          iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
56      }
57 }

?

2.5 s3c2410ts_remove,s3c2410ts_exit函數做的工作與上述相反。

3 寫代碼

3.1 框架

(1)分配一個input_dev結構體

(2)設置

(3)硬件相關的操作(難點)

(4)注冊

(5)進一步優化(可有可無,有是最好)???????

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???????????????????????????????????????????????

--------------------------------------------------------------編輯于2017-01-11 00:56:39

?? ADC使用的四個步驟:

(1)設置ADCCON寄存器,選擇輸入信號通道,設置A/D轉換器時鐘。

(2)設置ADCTSC寄存器,設置其為觸摸屏使用。

(3)設置ADCCON寄存器,啟動A/D轉換。

(4)轉換結束時,讀取ADCDAT0寄存器獲取數值。

  1 /*參考s3c2410_ts.c*/
  2 
  3 #include <linux/errno.h>
  4 #include <linux/kernel.h>
  5 #include <linux/module.h>
  6 #include <linux/slab.h>
  7 #include <linux/input.h>
  8 #include <linux/init.h>
  9 #include <linux/serio.h>
 10 #include <linux/delay.h>
 11 #include <linux/platform_device.h>
 12 #include <linux/clk.h>
 13 #include <asm/io.h>
 14 #include <asm/irq.h>
 15 
 16 #include <asm/plat-s3c24xx/ts.h>
 17 
 18 #include <asm/arch/regs-adc.h>
 19 #include <asm/arch/regs-gpio.h>
 20 
 21 struct s3c_ts_regs{
 22     unsigned long adccon;
 23     unsigned long adctsc;
 24     unsigned long adcdly;
 25     unsigned long adcdat0;
 26     unsigned long adcdat1;
 27     unsigned long adcupdn;
 28 
 29 };
 30 
 31 static struct input_dev *s3c_ts_dev;
 32 static struct clk    *adc_clock;
 33 static volatile struct s3c_ts_regs *s3c_ts_regs;
 34 static struct timer_list ts_timer;
 35 
 36 static void wait_pen_down_mode()
 37 {    
 38     s3c_ts_regs->adctsc = 0xd3;
 39 }
 40 
 41 static void wait_pen_up_mode()
 42 {    
 43     s3c_ts_regs->adctsc = 0x1d3;
 44 }
 45 
 46 static void measure_xy_mode()
 47 {
 48     s3c_ts_regs->adctsc = (1<<3) |(1<<2);
 49 }
 50 
 51 static void start_adc()
 52 {
 53     s3c_ts_regs->adccon |= (1<<0); 
 54 }
 55 
 56 static int s3c_filter_ts(int x[], int y[])
 57 {
 58 #define ERR_LIMIT 10
 59 
 60     int avr_x, avr_y;
 61     int det_x, det_y;
 62 
 63     avr_x = (x[0] + x[1])/2;
 64     avr_y = (y[0] + y[1])/2;
 65 
 66     det_x = (x[2] > avr_x) ? (x[2] - avr_x) : (avr_x - x[2]);
 67     det_y = (y[2] > avr_y) ? (y[2] - avr_y) : (avr_y - y[2]);
 68 
 69     if ((det_x > ERR_LIMIT) || (det_y > ERR_LIMIT))
 70         return 0;
 71 
 72     avr_x = (x[1] + x[2])/2;
 73     avr_y = (y[1] + y[2])/2;
 74 
 75     det_x = (x[3] > avr_x) ? (x[3] - avr_x) : (avr_x - x[3]);
 76     det_y = (y[3] > avr_y) ? (y[3] - avr_y) : (avr_y - y[3]);
 77 
 78     if ((det_x > ERR_LIMIT) || (det_y > ERR_LIMIT))
 79         return 0;
 80     
 81     return 1;
 82 }
 83 
 84 static void s3c_ts_timer_func(unsigned long data)
 85 {
 86     if (s3c_ts_regs->adcdat0 & (1<<15))
 87     {
 88         /*pen up*/
 89         input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);
 90         input_report_key(s3c_ts_dev, BTN_TOUCH, 0);
 91         input_sync(s3c_ts_dev);
 92         wait_pen_down_mode();
 93     }
 94     else
 95     {
 96         /* 測量X/Y坐標 */
 97         measure_xy_mode();
 98         start_adc();
 99     }
100 }
101 
102 
103 static irqreturn_t tc_irq(int irq, void *dev_id)
104 {    
105     if(s3c_ts_regs->adcdat0 & (1<<15))
106     {
107         /*pen up*/
108         
109          input_report_key(s3c_ts_dev, BTN_TOUCH, 0);
110          input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);
111          input_sync(s3c_ts_dev);
112         wait_pen_down_mode();
113 
114     }
115     else
116     {
117         measure_xy_mode();
118         start_adc();
119     }
120     return IRQ_HANDLED;
121 }
122 
123 static irqreturn_t adc_irq(int irq, void *dev_id)
124 {    
125     static int cnt = 0;
126     static int x[4],y[4];
127     int adcdat0, adcdat1;
128 
129     adcdat0 = s3c_ts_regs->adcdat0;
130     adcdat1 = s3c_ts_regs->adcdat1;
131 
132     /*如果發現ADC轉換完成后pen up,則丟棄數據*/
133     if(s3c_ts_regs->adcdat0 & (1<<15))
134     {    /*pen up*/
135         cnt = 0;
136         input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);
137         input_report_key(s3c_ts_dev, BTN_TOUCH, 0);
138         input_sync(s3c_ts_dev);
139         wait_pen_down_mode();
140     }
141     else
142     {
143         /*多次測量,取平均值*/
144         x[cnt] = adcdat0 & 0x3ff;
145         y[cnt] = adcdat1 & 0x3ff;
146         ++cnt;
147         if (cnt == 4)
148         {
149             /*軟件過濾*/
150             if (s3c_filter_ts(x, y))
151             {            
152                 //printk("x = %d, y = %d\n", (x[0]+x[1]+x[2]+x[3])/4, (y[0]+y[1]+y[2]+y[3])/4);
153                 input_report_abs(s3c_ts_dev, ABS_X, (x[0]+x[1]+x[2]+x[3])/4);
154                 input_report_abs(s3c_ts_dev, ABS_Y, (y[0]+y[1]+y[2]+y[3])/4);
155                 input_report_abs(s3c_ts_dev, ABS_PRESSURE, 1);
156                 input_report_key(s3c_ts_dev, BTN_TOUCH, 1);
157                 input_sync(s3c_ts_dev);
158             }
159             cnt = 0;
160             wait_pen_up_mode();
161             /*啟動定時器實現長按/滑動的情況*/
162             mod_timer(&ts_timer, jiffies + HZ/100);
163 
164         }
165         else
166         {
167             measure_xy_mode();
168             start_adc();
169         }
170 
171             
172     }
173     return IRQ_HANDLED;
174 }
175 
176 
177 
178 static int s3c_ts_init(void)
179 {    /*1.分配一個input_dev結構體*/
180     s3c_ts_dev = input_allocate_device();
181     if (!s3c_ts_dev) {
182         printk(KERN_ERR "Unable to allocate the input device !!\n");
183         return -ENOMEM;
184     }
185 
186     /*2 設置這個結構體*/
187     /*2.1 設置事件類型*/
188     set_bit(EV_KEY,s3c_ts_dev->evbit);
189     set_bit(EV_ABS,s3c_ts_dev->evbit);
190 
191     /*2.2 設置該類型下的哪一個具體事件*/
192     set_bit(BTN_TOUCH,s3c_ts_dev->keybit);
193 
194     input_set_abs_params(s3c_ts_dev, ABS_X, 0, 0x3FF, 0, 0);
195     input_set_abs_params(s3c_ts_dev, ABS_Y, 0, 0x3FF, 0, 0);
196     input_set_abs_params(s3c_ts_dev, ABS_PRESSURE, 0, 1, 0, 0);
197 
198     /*3 注冊*/
199     input_register_device(s3c_ts_dev);
200 
201     /*4 硬件相關的操作*/
202     /*4.1 使能ADC 時鐘*/
203     adc_clock = clk_get(NULL, "adc");
204     if (!adc_clock) {
205         printk(KERN_ERR "failed to get adc clock source\n");
206         return -ENOENT;
207     }
208     clk_enable(adc_clock);
209 
210     /*4.2 寄存器初始化*/
211     s3c_ts_regs = ioremap(0x58000000,sizeof(struct s3c_ts_regs));
212     s3c_ts_regs->adccon = (1<<14) |(49<<6);
213 
214     /*4.3 申請中斷*/
215     request_irq(IRQ_TC, tc_irq, IRQF_SAMPLE_RANDOM,"tc", NULL);
216     request_irq(IRQ_ADC, adc_irq, IRQF_SAMPLE_RANDOM,"adc", NULL);
217 
218     s3c_ts_regs->adcdly = 0xffff;/*待數值穩定后在轉換*/
219 
220     init_timer(&ts_timer);
221     ts_timer.function = s3c_ts_timer_func;
222     add_timer(&ts_timer);
223     
224     wait_pen_down_mode();
225     
226     return 0;
227 }
228 
229 static void s3c_ts_exit(void)
230 {
231     free_irq(IRQ_TC, NULL);
232     free_irq(IRQ_ADC, NULL);
233     iounmap(s3c_ts_regs);
234     input_unregister_device(s3c_ts_dev);
235     input_free_device(s3c_ts_dev);
236     del_timer(&ts_timer);
237     
238 }
239 
240 module_init(s3c_ts_init);
241 module_exit(s3c_ts_exit);
242 
243 
244 MODULE_LICENSE("GPL");
觸摸屏驅動

--------------------------------------------------------------編輯于2017-01-11?18:21:04

轉載于:https://www.cnblogs.com/Lwd-linux/p/6272019.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259742.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259742.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259742.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編碼文件AndroidStudio初體驗:解決Execution failed for task ':TestAndroid:compileDebug'.

最近研究編碼文件&#xff0c;稍微總結一下&#xff0c;以后繼續補充&#xff1a; Execution failed for task :TestAndroid:compileDebug.有各種各樣原因&#xff0c;具體就請自己進cmd編譯看什么地方出錯 進入項目的gradle文件地點目錄打 gradlew compileDebug --stacktrace來…

我的大二

一不小心就已經大二了&#xff0c;時間真的過的很快&#xff0c;不知不覺和學長大大一起走過了7個多月~我是個很幸運的人&#xff0c;對此我感激所有人&#xff0c;尤其是那些愛我的&#xff0c;以及教會我做人&#xff0c;指引我許多的人們&#xff01; 不得不承認&#xff0c…

2016國產開源軟件Top100(Q1)

2016國產開源軟件Top100(Q1) 隨著互聯網的發展、開放標準的普及和虛擬化技術的應用等諸多IT新領域的創新及拓展&#xff0c;開源技術憑借其開放性、低成本、穩定性、靈活性、安全性和技術創新性等特點迅速走向成熟&#xff0c;逐步發展成為一種主流模式&#xff0c;日益改變著全…

mysql lenenc int_MySQL-NonMySQL同步工具源碼解讀——確定同步位置

經過上一節的鑒權過后&#xff0c;程序已經受主庫認可&#xff0c;并且可以像主庫發起同步請求。在發起請求之前&#xff0c;還有一個可選的步驟&#xff1a;確認同步時間點。同步時間點由兩個屬性進行標識&#xff1a;Binlog文件名、偏移量。工具支持自定義時間點&#xff0c;…

DancingLinks刷題集

HDU 3663 Power Stations 精確覆蓋 題意&#xff1a;每個城市i有xi->yi天可以成為發射站&#xff0c;發射站覆蓋范圍為與該站有一條邊鏈接的城市。 同時&#xff0c;每個每天城市必須且只能被一個發射站覆蓋 天數D<5。 每個城市的發射站關閉后就不再開啟。即只能選擇一段…

【web前端優化】前端無優化,庸人自擾之!

前言 我發現一個人厲害不只是他厲害&#xff0c;他的名字也一定要跟著厲害才行&#xff0c;比如我刀狂劍癡葉小釵了&#xff0c;若是老夫叫做刀狂劍癡葉小草&#xff0c;估計就缺少氣勢了&#xff01;&#xff01;&#xff01; 又如百世經綸一頁書&#xff0c;如果叫做百世經綸…

react源碼解讀 {createClass}

對一個框架源碼的解讀&#xff0c;既有利于更深入地了解框架&#xff0c;使用上更得心應手&#xff0c;又可以學習到其中代碼組織的思路&#xff0c;吸收其精華簡潔的寫法以便于日常工作上使用。下面我就挑選近年大熱門react&#xff08;15.3.1&#xff09;&#xff0c;從中剖析…

mysql分析sql語句性能_sql語句執行性能分析

explain根據上面提到的explain去比較&#xff0c;就可以得出結果了mysql> explain select * from users limit 1000,20;---------------------------------------------------------------------------------| id | select_type | table | type | possible_keys | key | key…

sourceTree添加git密鑰步驟

給多個遠程服務器比如https://github.com/wangjian2014/wjtest/blob/master/wj.txt添加public密鑰 本地服務器添加private密鑰 SSH Client 選擇PuTTY/Plink 選擇Generate&#xff0c;生成public 和private密鑰&#xff0c;將public密鑰數據復制到遠程服務器上面 保存private…

[tomcat] 配置數據源介紹

從tomcat5.5開始,內置了DBCP數據源的實現。tomcat數據源提供兩種配置方式,兩種數據源的訪問范圍不同&#xff0c; 1.全局數據源:顧名思義在tomcat應用下的所有web都可以訪問。 2.局部數據源&#xff1a;適用單個web應用 ★★ 不管以那種方式都得提供特定數據源的jdbc驅動。 此…

background-size

background-size:contain;contain:包含 按比例調整圖片&#xff0c;使得圖片的寬度自適應容器的寬度。 相當于在ps中&#xff0c;約束比例設置原始圖片的寬度值等于容器的寬度值。 如果圖片過大&#xff0c;等比壓縮后容器的高度方向上可能會有空白。 background-size:cover;co…

在mybatis用mysql的代碼塊_關于Mybatis 中使用Mysql存儲過程的方法

1.存儲過程的簡介我們常用的操作數據庫語言SQL語句在執行的時候需要要先編譯&#xff0c;然后執行&#xff0c;而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集&#xff0c;經編譯后存儲在數據庫中&#xff0c;用戶通過指定存儲過程的名字并給定參數(如果該存儲…

MySQL5.6免安裝配置與“系統找不到指定的文件”錯誤

1.下載免安裝版本的mysql-5.6.11-winx64 (本機 win7 64位)2.將文件解壓到任意&#xff0c;不要有中文&#xff08;有中文的情況沒試過&#xff0c;不過最好避免這種情況&#xff09;3.配置mysql 環境變量&#xff0c;在 path后面加上D:\Program Files\mysql-5.6.11-winx64\bin…

安裝配置OSA運維管理平臺

1、下載完整包V1.0.2wget http://www.osapub.com/download/OSA_BETA_V1.0.2.tar.gzV1.0.5wget http://www.osapub.com/download/OSA_BETA_V1.0.5.tar.gz 2、解壓安裝tar xvf OSA_BETA_V1.0.5.tar.gzmv osa /usr/local/ PS&#xff1a;該版本只允許指向/usr/local/osa/目錄&…

as5300g2 nas軟件功能_【浪潮混閃存儲AS5300G5-可同時提供SAN和NAS兩種服務的中端混閃存儲系統】價格_廠家 - 中國供應商...

功能特性極速性能(1)平臺升級&#xff1a;G5采用全新一代硬件平臺&#xff0c;芯片升級、規格升級&#xff0c;性能同比上一代平均提升30%&#xff0c;為提高存儲系統的數據處理效率提供有力支撐。同時結合G5的智能軟件&#xff0c;如智能緩存加速、智能分層、智能QOS等高級功能…

c 總結

C-總結 #pragma mark - 第一章&#xff1a;C基礎 void func1(); void func1() { // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int a 030; // 以0開頭得數是八進制的數&#xff0c;計算的時候要換算成10進制進行計算 int b a * 10; printf("%d", b); // 此時打印…

windows下使用cpanm進行模塊安裝

windows下使用cpanm進行模塊安裝要放假了&#xff0c;突然想整理一下手頭上的軟件&#xff0c;突然發現perl的安裝模塊這個功能不能用。弄了一下&#xff0c;使得windows 下 perl 的 cpanm能用&#xff0c;避免成天為了依賴痛苦。軟件版本&#xff1a;#理論上此方法所有版本通用…

Response緩沖區

1 protected void Page_Load(object sender, EventArgs e)2 {3 //關閉緩沖區&#xff0c;輸出會一個一個寫出來&#xff08;只有在火狐瀏覽器中才有效果&#xff09;。4 //Response.BufferOutput false;5 6 //開啟緩沖區7 Response.Buffe…

Javascript模塊模式學習分享

之前一直也有聽說和接觸到模塊模式、這次整理了一下、感覺蠻有收獲的、特來分享。 模塊模式很基本的一點就是匿名函數的 閉包、通過這點來實現。 1 //模塊模式2 3 var MODULE (function(){4 /*函數默認是返回this的、但是定義了my對象后、return my; 返回值就變成了my對象…

Source Insight基本使用和快捷鍵

為什么要用Source Insight呢&#xff1f;貌似是因為比完整的IDE要更快一些&#xff0c;比較利于查看大量的代碼。 軟件的安裝很簡單&#xff0c;設置好安裝目錄。 配置好文檔路徑&#xff0c;當然這個也可以在Options里面改&#xff0c;選Options->Preferences…里面的Folde…