• slider image 442
  • slider image 477
  • slider image 479
  • slider image 480
  • slider image 481
  • slider image 482
:::


Browsing this Thread:   1 Anonymous Users






Re: 关键字static应用的疑问
#5
資深會員
資深會員


查看用戶資訊
問題一
基本static的相對是dynamic.沒有特別宣告的變數,
以dynamic看待,一般實作在dynamic上採用stack方式,
但單晶片能力有限,是否能實作出dynamic就不一定
(一般都是能力有限,甚至沒有資料用的stack),實作上則有所差別.
試試你正在用的windows或Linux之類的OS上的compiler
結果想必又不同.
(基本上,你在教課書及學校學到的compiler概念均以computer
為基礎,而非單晶片為基礎)
想想第一支printf("Hello world!!!\n"); --很多單晶片上是無效的.
(指的是"看"不到結果!!!)


問題二
延續問題一,static與實作有關,且你並沒有在宣告時給初始值.
所以有可能是static及dynamic結果一樣.

發表於: 2009/4/4 11:50
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 关键字static应用的疑问
#4
資深會員
資深會員


查看用戶資訊
參照:

twd3621576 寫道:

問題一:添加關鍵字static跟代碼長度有關係,且對代碼是否有影響。
分析 :代碼加了static關鍵字的代碼明顯少許多,然而當添加其他關鍵字時與不添加關鍵字的代碼都一樣。
所以添加static那不是就能起到優化代碼的目的了嗎
結論 :既然這樣,每次在子函數中使用到的變數都用static關鍵字申明。請求幫忙分析!


你都自問自答的講完了
還需要分析甚麼呢??
看不懂你的問題在哪裡?

發表於: 2009/4/3 17:36
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 關鍵字static應用的疑問
#3
資深會員
資深會員


查看用戶資訊
加static 的變數和外部變數是一樣的意思
只差在可視範圍不同而已
請參考以下

http://www.microchip.com.tw/modules/n ... t_id=23082#forumpost23082

發表於: 2009/4/3 17:25
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 關鍵字static應用的疑問
#2
資深會員
資深會員


查看用戶資訊
1)前輟是給compiler看的,跟程式沒有直接關係。

2)程式最佳化是魚與熊掌的問題,相對於speed、size、可攜性、可閱性,首重演算,其次技巧。

發表於: 2009/4/3 16:18
The Answer to Life, the Universe, and Everything.
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


关键字static应用的疑问
#1
新會員
新會員


查看用戶資訊
Temp()是主函数调用的一个子函数 通过调试结果发现 添加与不添加关键字变量 i 在运行过程中结果是一样的 。且i的值都一直为递增。

问题一:添加关键字static跟代码长度有关系,且对代码是否有影响。
分析 :代码加了static关键字的代码明显少许多,然而当添加其他关键字时与不添加关键字的代码都一样。
所以添加static那不是就能起到优化代码的目的了吗
结论 :既然这样,每次在子函数中使用到的变量都用static关键字申明。请求帮忙分析!

问题二:申明与不申明关键字static时被调用时对变量初始化问题
分析: C语言中添加关键字static在被调用的时候只初始化一次待下次调用的时候以前次结果为依据,所以上面结果是正确的。
但是不添加关键字static时应该是每次调用应都该初始化一次变量把。数值应该不会一直递增的。
结论:是编译器自动优化还是与标准C 有区别或是个人理解有问题。

附加:而通过对比 51中keil的汇编代码加不加static代码都一样

/***************************什么关键
簡體轉繁體方便閱讀 :
Temp()是主函數調用的一個子函數 通過調試結果發現 添加與不添加關鍵字變數 i 在運行過程中結果是一樣的 。且i的值都一直為遞增。

問題一:添加關鍵字static跟代碼長度有關係,且對代碼是否有影響。
分析 :代碼加了static關鍵字的代碼明顯少許多,然而當添加其他關鍵字時與不添加關鍵字的代碼都一樣。
所以添加static那不是就能起到優化代碼的目的了嗎
結論 :既然這樣,每次在子函數中使用到的變數都用static關鍵字申明。請求幫忙分析!

問題二:申明與不申明關鍵字static時被調用時對變數初始化問題
分析: C語言中添加關鍵字static在被調用的時候只初始化一次待下次調用的時候以前次結果為依據,所以上面結果是正確的。
但是不添加關鍵字static時應該是每次調用應都該初始化一次變數把。數值應該不會一直遞增的。
結論:是編譯器自動優化還是與標準C 有區別或是個人理解有問題。

附加:而通過對比 51中keil的彙編代碼加不加static代碼都一樣

/***************************什麼關鍵字也沒


字也没加************************************************************/
void temp(void)
00CA CFD9 MOVFF 0xfd9, 0xfe6
00CC FFE6 NOP
00CE CFE1 MOVFF 0xfe1, 0xfd9
00D0 FFD9 NOP
00D2 52E6 MOVF 0xfe6, F, ACCESS
5: {
6: //register
7: //static
8: //volatile
9: unsigned char i ;
00D4 2ADF INCF 0xfdf, F, ACCESS
10: i++;
00D6 52E5 MOVF 0xfe5, F, ACCESS
00D8 52E5 MOVF 0xfe5, F, ACCESS
00DA CFE7 MOVFF 0xfe7, 0xfd9
00DC FFD9 NOP
00DE 0012 RETURN 0
/***************************添加volatile关键字**************************************************************/
void temp(void)
00CA CFD9 MOVFF 0xfd9, 0xfe6
00CC FFE6 NOP
00CE CFE1 MOVFF 0xfe1, 0xfd9
00D0 FFD9 NOP
00D2 52E6 MOVF 0xfe6, F, ACCESS
5: {
6: //register
7: //static
8: volatile
9: unsigned char i ;
10: i++;
00D4 2ADF INCF 0xfdf, F, ACCESS
11: }
00D6 52E5 MOVF 0xfe5, F, ACCESS
00D8 52E5 MOVF 0xfe5, F, ACCESS
00DA CFE7 MOVFF 0xfe7, 0xfd9
00DC FFD9 NOP
00DE 0012 RETURN 0
/*********************************添加register关键字*******************************************************************************/
void temp(void)
00CA CFD9 MOVFF 0xfd9, 0xfe6
00CC FFE6 NOP
00CE CFE1 MOVFF 0xfe1, 0xfd9
00D0 FFD9 NOP
00D2 52E6 MOVF 0xfe6, F, ACCESS
5: {
6: register
7: //static
8: //volatile
9: unsigned char i ;
10: i++;
00D4 2ADF INCF 0xfdf, F, ACCESS
11: }
00D6 52E5 MOVF 0xfe5, F, ACCESS
00D8 52E5 MOVF 0xfe5, F, ACCESS
00DA CFE7 MOVFF 0xfe7, 0xfd9
00DC FFD9 NOP
00DE 0012 RETURN 0
/*****************************添加static关键字************************************************************************/
void temp(void)
5: {
6: //register
7: static
8: //volatile
9: unsigned char i ;
10: i++;
00E2 0100 MOVLB 0
00E4 2B8A INCF 0x8a, F, BANKED
11: }
00E6 0012 RETURN 0

Attach file:


Link only for registered users

發表於: 2009/4/3 11:02

Edited by Ryang on 2009年04月03日 13:41:54
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------