久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6977|回復: 48
打印 上一主題 下一主題
收起左側

小容量的單片機芯片怎么提高存儲空間利用率?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:887202 發表于 2021-9-22 11:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如題,最近接觸到一款存儲空間非常小的單片機,代碼量稍微大一點就用不了了,所以想問問大伙有沒有提高存儲空間利用率的辦法
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:88256 發表于 2021-9-22 12:02 | 只看該作者
用匯編吧
回復

使用道具 舉報

板凳
ID:277550 發表于 2021-9-22 12:12 | 只看該作者
精簡代碼。。。
回復

使用道具 舉報

地板
ID:57657 發表于 2021-9-22 12:19 | 只看該作者
具體是多少位,什么型號?
回復

使用道具 舉報

5#
ID:161164 發表于 2021-9-22 12:39 | 只看該作者
把代碼貼上來看看
回復

使用道具 舉報

6#
ID:90613 發表于 2021-9-22 13:17 | 只看該作者
減少不必要的程序,特別是數組,能少定義就少定義,能不定義全局變量就不要全局。.h文件也不要隨便定義,如果只用到printf而調用了 <stdio.h>,就不要用了
回復

使用道具 舉報

7#
ID:366464 發表于 2021-9-22 13:26 | 只看該作者
加24系列芯片,想加多大就多大!
回復

使用道具 舉報

8#
ID:712493 發表于 2021-9-22 13:37 | 只看該作者
guizaishi 發表于 2021-9-22 13:17
減少不必要的程序,特別是數組,能少定義就少定義,能不定義全局變量就不要全局。.h文件也不要隨便定義,如 ...

實際局部變量也不見得小,要知道局部變量有生存周期,如果生存周期長了,沒有及時銷掉,跟全局有啥區別,甚至還不如全局
回復

使用道具 舉報

9#
ID:514901 發表于 2021-9-22 13:48 | 只看該作者
經典的時間換空間的方法
回復

使用道具 舉報

10#
ID:887202 發表于 2021-9-22 13:53 | 只看該作者
感謝各位的回復,芯片是SQ013L,目前的代碼里面已經非常精簡了,所有的全局變量都是按位來定義的,使用了位域來定義全局變量,比較坑爹的就是,貌似官方的這個開發環境下臨時變量使用完之后空間不會釋放掉,還是會占用資源
回復

使用道具 舉報

11#
ID:887202 發表于 2021-9-22 13:53 | 只看該作者
npn 發表于 2021-9-22 12:19
具體是多少位,什么型號?

SQ013L
回復

使用道具 舉報

12#
ID:123289 發表于 2021-9-22 15:39 | 只看該作者
只有當你懂得匯編和單片機原理時,才能準確地精減并節省出空間。
當你懂匯編后,才會知道C語言在何情況下浪費、節省空間,如此你當然就知道如何做了。
回復

使用道具 舉報

13#
ID:624769 發表于 2021-9-22 15:42 | 只看該作者
sadv 發表于 2021-9-22 13:53
感謝各位的回復,芯片是SQ013L,目前的代碼里面已經非常精簡了,所有的全局變量都是按位來定義的,使用了位 ...

只要是用C編寫的,永遠沒資格說“非常”精簡,全局變量,和和多所謂的局部變量,對程序大小是沒有直接關聯的,有關聯的是放入 R0~R7 的變量,還是放入內存地址的變量,尤其是牽涉到計算,會對程序大小影響很大。然后避免只用一兩次的子函數,直接囊括到主程序,也會有效的減小代碼,調用一次子函數,就要有大量的 MOV R7,xxxx  以及返回后的 MOV xxxx, R7  這都是平白浪費空間的操作,以及可重入函數,不管有沒有涉及到重入的操作,都會有很多的 PUSH 和 POP 代碼。其實程序要縮小個20%左右,改匯編完全就能塞得下。
回復

使用道具 舉報

14#
ID:401564 發表于 2021-9-22 15:58 | 只看該作者
這玩意是仿(義隆(仿PIC匯編))指令的OTP單片機,也不知道是誰仿誰,反正是跟著PIC走的
內存只有1K,而且,是運行精簡指令的,沒有乘除法指令
所以,用C語言寫的話:盡量不要用浮點型數據,盡量少用乘除法之類的高級運算
當然,最有效的辦法就是用匯編來寫,一般這種低端國產OTP單片機,有些公司會要求指定用匯編來寫的
回復

使用道具 舉報

15#
ID:419909 發表于 2021-9-22 16:00 | 只看該作者
如果是用Keil的話。里面有一個代碼優化級別的。你選最大。有時會省20%左右空間。但是會讓你程序慢一些。這個看你自己決定
回復

使用道具 舉報

16#
ID:887202 發表于 2021-9-22 16:00 | 只看該作者
188610329 發表于 2021-9-22 15:42
只要是用C編寫的,永遠沒資格說“非常”精簡,全局變量,和和多所謂的局部變量,對程序大小是沒有直接關 ...

不懂匯編,不過感覺你說的很有道理,對于您說的調用次數很少的子函數浪費空間的問題我也有做優化,目前卡在一行進行了多次移位和邏輯處理的語句上,加上這行語句程序大小增大很多就超出容量,單片機的RAM和ROM空間都很小,優化了好一段時間也塞不進去。
回復

使用道具 舉報

17#
ID:624769 發表于 2021-9-22 16:03 | 只看該作者
sadv 發表于 2021-9-22 16:00
不懂匯編,不過感覺你說的很有道理,對于您說的調用次數很少的子函數浪費空間的問題我也有做優化, ...

有些精度不高的中間量,比如本來 0-500, 縮小到 0-250,用1個字節,也是精簡的一個方案,你可以參考一下。
回復

使用道具 舉報

18#
ID:887202 發表于 2021-9-22 16:06 | 只看該作者
Y_G_G 發表于 2021-9-22 15:58
這玩意是仿(義隆(仿PIC匯編))指令的OTP單片機,也不知道是誰仿誰,反正是跟著PIC走的
內存只有1K,而且,是運 ...

確實是想替代義隆的單片機才找到的SQ013L,運算方面沒有用到浮點類型的數據,基本都是加減法和邏輯與或非的運算。這個代碼只是一個demo,還有其他同事會在這個版本的基礎上修改滿足不同客戶的需求,匯編的話大家都不會,改用匯編寫就會比較麻煩。
回復

使用道具 舉報

19#
ID:887202 發表于 2021-9-22 16:08 | 只看該作者
wfqxgw 發表于 2021-9-22 16:00
如果是用Keil的話。里面有一個代碼優化級別的。你選最大。有時會省20%左右空間。但是會讓你程序慢一些。這 ...

是用的官方的開發環境,沒有KEIL那么強大,而且優化效率不高,只能自己在代碼上想辦法
回復

使用道具 舉報

20#
ID:887202 發表于 2021-9-22 16:10 | 只看該作者
188610329 發表于 2021-9-22 16:03
有些精度不高的中間量,比如本來 0-500, 縮小到 0-250,用1個字節,也是精簡的一個方案,你可以參考一下 ...

感謝,已經做過嘗試,所有變量都是按位來定義的,也沒有用到這么大的數據,8位就夠用了
回復

使用道具 舉報

21#
ID:887202 發表于 2021-9-22 16:19 | 只看該作者
sadv 發表于 2021-9-22 13:53
感謝各位的回復,芯片是SQ013L,目前的代碼里面已經非常精簡了,所有的全局變量都是按位來定義的,使用了位 ...

感謝各位的回復,開發環境是芯片官方提供的,沒有KEIL那么強大的功能,優化效率也比較低,我們在使用中甚至發現在函數中定義的臨時變量會一直占用空間,退出函數后空間得不到釋放的情況,導致本來就不多的資源更是捉襟見肘,為此只有定義兩個全局在變量在各個子函數中做臨時變量使用。為了節約資源所有的變量都是按位定義的,也盡量減少子函數的調用,此代碼將會經過多位同事的手做一些修改給到不同客戶,大家都不會匯編,暫不考慮用匯編寫。
回復

使用道具 舉報

22#
ID:624769 發表于 2021-9-22 16:22 | 只看該作者
sadv 發表于 2021-9-22 16:10
感謝,已經做過嘗試,所有變量都是按位來定義的,也沒有用到這么大的數據,8位就夠用了

那就在 子函數 不傳參方面嘗試。一旦子函數傳參,就會多出很多 MOV  如果,引用的變量固定,返回的變量也固定,可以試試。
還有 如果程序有很多 位操作 的話,可以嘗試用 unsigned char bdata   xxxx; 來定義字節變量,然后用 sbit 來定義每一個位, 那么在大量的,位定義的時候, 可以直接 用16進制數對字節統一定義,畢竟改寫一個 字節 只需要 3個字節的程序, 改寫一個位就要 2個字節程序,改寫8個位就會需要16個字節程序,直接用字節方式改寫,就能省下 13個字節的程序。再不行就嘗試啃啃匯編了,我當初也是為了壓縮壓縮再壓縮才學的匯編。用習慣后感覺在8位機編程來講,個人開發,還是匯編用的更順手。就算合作開發的話,也可以自己負責寫底層,然后PUBLIC,對方extern 調用,這樣混合編寫也不錯。
回復

使用道具 舉報

23#
ID:887202 發表于 2021-9-22 16:54 | 只看該作者
188610329 發表于 2021-9-22 16:22
那就在 子函數 不傳參方面嘗試。一旦子函數傳參,就會多出很多 MOV  如果,引用的變量固定,返回的變量也 ...

函數不傳參方面也已經優化過了,看了大家的說法感覺只有匯編才能解決了
回復

使用道具 舉報

24#
ID:668885 發表于 2021-9-22 17:25 | 只看該作者
小容量的單片機,要用匯編,盡量精簡代碼
回復

使用道具 舉報

25#
ID:592807 發表于 2021-9-22 17:35 | 只看該作者
盡量別用庫,printf函數所在的庫,直接占據8K
回復

使用道具 舉報

26#
ID:887202 發表于 2021-9-22 17:48 | 只看該作者
黃youhui 發表于 2021-9-22 17:35
盡量別用庫,printf函數所在的庫,直接占據8K

不敢不敢,一個字節都要精打細算的,不敢這么奢侈,根本就沒用UART
回復

使用道具 舉報

27#
ID:887202 發表于 2021-9-22 17:48 | 只看該作者
oblivionqqqqq 發表于 2021-9-22 17:25
小容量的單片機,要用匯編,盡量精簡代碼

考慮中
回復

使用道具 舉報

28#
ID:401564 發表于 2021-9-22 17:54 | 只看該作者
sadv 發表于 2021-9-22 16:06
確實是想替代義隆的單片機才找到的SQ013L,運算方面沒有用到浮點類型的數據,基本都是加減法和邏輯與或非 ...

24#也說,盡量別用的庫,有庫函數并不是一條語句那么簡單的
在C語言編譯器效率那么高,單片機片上資源越來越豐富的今天,匯編還有人在學,就說明匯編還是有一定作用的
函數調用不用程序空間的,主要是函數本身
1,全局變量和靜態變量能不用就不用
2,庫函數能少用就少用
3,函數內部的變量盡量用 unsigned char型,但這個在不同的編譯環境下優化效果不一樣,有的壓根就沒用,但也可以試一下
4,函數盡量少一點
回復

使用道具 舉報

29#
ID:824490 發表于 2021-9-22 19:49 | 只看該作者
1、少用靜態數組 uchar code xxx[]={},少用全局標志。
2、for語句步進用減,不用加:for(a=8;a>0;a--),ASM指令有減一(為0)跳轉,少有加一跳轉(多了判斷)
3、盡量不要多重調用,如:
    void a()調用void b();void b()又調用void C();void c()中又調用了void c().....(常見于各種顯示函數)
4、不要同時開多個中斷,每一個中斷產生都會用到棧、都要保護現場。
5、短延時小于5個指令周期的盡量直接用空轉NOP,調用延函數一進一出都費事。

  
  
回復

使用道具 舉報

30#
ID:155507 發表于 2021-9-22 19:51 | 只看該作者
芯圣SQ013L是一顆採用高速低功耗CMOS工藝設計開發的8位元高性能精簡指令單片機, 內部有1K*14位一次性可程式設計ROM(OTP-ROM),49*8位的資料記憶體(RAM),兩個雙向I/O口,1個8位Timer計時器/計數器。

最有效的辦法就是用匯編來寫
回復

使用道具 舉報

31#
ID:491577 發表于 2021-9-23 01:32 | 只看該作者
這個單片機多少錢一片?資源這么少
回復

使用道具 舉報

32#
ID:155507 發表于 2021-9-23 07:27 | 只看該作者
hhh402 發表于 2021-9-23 01:32
這個單片機多少錢一片?資源這么少

這個單片機一片 ¥0.13
回復

使用道具 舉報

33#
ID:359272 發表于 2021-9-23 08:00 | 只看該作者
我也在用一款資源一樣的mcu,用C語言代碼寫不下,砍掉30%的功能,客戶勉強接受了
回復

使用道具 舉報

34#
ID:592807 發表于 2021-9-23 08:30 | 只看該作者
hhh402 發表于 2021-9-23 01:32
這個單片機多少錢一片?資源這么少

STC11F04E   2塊一片
回復

使用道具 舉報

35#
ID:146579 發表于 2021-9-23 09:15 | 只看該作者
1.使用匯編語言編寫程序,自己安排存儲空間。
回復

使用道具 舉報

36#
ID:146579 發表于 2021-9-23 09:16 | 只看該作者
1.使用匯編語言,合理安排存儲空間
2.優化算法,減少代碼量
回復

使用道具 舉報

37#
ID:887202 發表于 2021-9-23 10:28 | 只看該作者
slf252 發表于 2021-9-23 08:00
我也在用一款資源一樣的mcu,用C語言代碼寫不下,砍掉30%的功能,客戶勉強接受了

我們這是之前的MCU買不到了,給客戶找替代品找到這個,本來功能不復雜,就是邏輯上的判斷和比較特別多,再刪功能就沒意義了。
回復

使用道具 舉報

38#
ID:155507 發表于 2021-9-23 12:57 | 只看該作者
黃youhui 發表于 2021-9-23 08:30
STC11F04E   2塊一片

2塊, 可以買超過15片了
回復

使用道具 舉報

39#
ID:332444 發表于 2021-9-23 14:40 | 只看該作者
做個有趣的測試就知道C語言和匯編到底哪個能寫出占有更小的程序,也能測試出哪個優化最好,之下復制一個提問.
通過按鍵SW2(連接在P2_0口)控制LED1~LED2的亮滅狀態,要求如下: 1.系統上電后,LED1~LED2熄滅。 2.第一次按下SW2后,LED1點亮。 3.第二次按下SW2后,LED2點亮。 4.第三次按下SW2后,LED1熄滅。 5.第四次按下SW2后,LED2熄滅。 6.再次按下按鍵后,要求從步驟2開始進入新的控制周期。
回復

使用道具 舉報

40#
ID:332444 發表于 2021-9-23 15:05 | 只看該作者
本帖最后由 xianfajushi 于 2021-9-23 15:28 編輯

寫了一個不用數組的用判斷的

  1. unsigned char a=0;
  2. sbit k=P2^0;
  3. while(1)
  4. {
  5. if(!k)
  6. {
  7. ++a;
  8. while(!k);
  9. }
  10. if(a==1)P1=1;
  11. else if(a==2)P1=3;
  12. else if(a==3)P1=2;
  13. else {P1=a=0;}
  14. }
復制代碼

Program Size: data=9.0 xdata=0 code=71
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线播放国产一区二区三区 | 北条麻妃99精品青青久久主播 | 一区二区三区在线免费看 | 亚洲人成人网 | 国产成人精品一区二 | 一区二区三区四区免费观看 | av中文字幕在线观看 | 国产成人精品一区二区三区四区 | 国产丝袜一区二区三区免费视频 | 福利视频网 | 欧美成人一区二区三区 | 久草在线青青草 | 精品一区二区三区四区在线 | 国产综合区 | 久久国产精品一区 | 男女爱爱福利视频 | 久久精品福利视频 | 亚洲欧美精品在线观看 | 九九热在线观看视频 | 热久久久 | 久久精品这里 | 麻豆精品一区二区三区在线观看 | a级毛片基地 | 在线观看中文字幕 | 精品一区欧美 | 做a视频 | 久久精品免费 | 国产精品1区2区3区 一区中文字幕 | 中文在线а√在线8 | 日本久久久久久 | 91精品久久| 成人美女免费网站视频 | 91久久精品一区二区二区 | 欧美日韩亚洲一区 | 91中文字幕在线 | 国产一区在线免费观看 | 久久精品福利 | 精品一区二区三区四区五区 | 在线观看视频你懂得 | 欧美aaa一级片 | 91中文字幕在线 |