找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 10944|回復(fù): 12
收起左側(cè)

單片機(jī)執(zhí)行C語言時(shí)間計(jì)算

[復(fù)制鏈接]
ID:223571 發(fā)表于 2017-9-29 15:32 | 顯示全部樓層 |閱讀模式
1T模式,16M赫茲的單片機(jī),在c語言編程做延時(shí)運(yùn)算,使用do while結(jié)構(gòu)void Delay200ms()                //@16MHz{
        unsigned char i, j, k;

        i = 13;
        j = 41;
        k = 198;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
這個(gè)時(shí)間是怎么推算出來的呀?




回復(fù)

使用道具 舉報(bào)

ID:97438 發(fā)表于 2017-9-29 16:32 | 顯示全部樓層
根據(jù)運(yùn)行一個(gè)指令的時(shí)間,然后計(jì)算這個(gè)程序運(yùn)行了多少個(gè)指令。如果你用的是STC的單片機(jī)的話,它的那個(gè)下載工具里面有自動(dòng)幫你計(jì)算的工具。
回復(fù)

使用道具 舉報(bào)

ID:47286 發(fā)表于 2017-9-29 19:26 | 顯示全部樓層
在c下寫這種延時(shí) 設(shè)定好運(yùn)行頻率用c仿真 看經(jīng)過多少時(shí)間 估計(jì)出來的 在c下全c的語句很難精確計(jì)算時(shí)間 不知道c怎么編譯
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2017-9-29 21:48 | 顯示全部樓層
keil  c中,系統(tǒng)特殊寄存器組“Sys”中有一項(xiàng)“sec”和“states”,可查看程序執(zhí)行時(shí)間和運(yùn)行周期數(shù)。例如,執(zhí)行到延時(shí)子程序時(shí),記錄進(jìn)入該子程序的sec值,然后按過程單步鍵,快速執(zhí)行該子程序完畢,再讀取sec值,兩者之差,即為該子程序執(zhí)行時(shí)間。也可根據(jù)周期數(shù)states與圖2-8中設(shè)置的晶振頻率計(jì)算程序運(yùn)行時(shí)間。以上摘自張志良編著《80C51單片機(jī)實(shí)用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學(xué)習(xí)51單片機(jī)原理,程序(雙解c和匯編)語句條條有注解,便于閱讀理解,便于自學(xué)。
回復(fù)

使用道具 舉報(bào)

ID:223571 發(fā)表于 2017-9-29 22:07 | 顯示全部樓層
luoluoluo136 發(fā)表于 2017-9-29 16:32
根據(jù)運(yùn)行一個(gè)指令的時(shí)間,然后計(jì)算這個(gè)程序運(yùn)行了多少個(gè)指令。如果你用的是STC的單片機(jī)的話,它的那個(gè)下載 ...

“根據(jù)運(yùn)行一個(gè)指令的時(shí)間,然后計(jì)算這個(gè)程序運(yùn)行了多少個(gè)指令!斑@個(gè)我能理解;關(guān)鍵是指令語言是相對(duì)匯編而言,而不同結(jié)構(gòu)的C語言反匯編會(huì)有不同的指令語句,那么我的問題就變成了:是否有一種直接的規(guī)則針對(duì)不同的C語言結(jié)構(gòu)對(duì)應(yīng)出相應(yīng)的執(zhí)行時(shí)間?
回復(fù)

使用道具 舉報(bào)

ID:223571 發(fā)表于 2017-9-29 22:10 | 顯示全部樓層
luoluoluo136 發(fā)表于 2017-9-29 16:32
根據(jù)運(yùn)行一個(gè)指令的時(shí)間,然后計(jì)算這個(gè)程序運(yùn)行了多少個(gè)指令。如果你用的是STC的單片機(jī)的話,它的那個(gè)下載 ...

還有一個(gè)問題,關(guān)于你的第二個(gè)回答,這是STC芯片。這是一個(gè)已經(jīng)存在的時(shí)間延時(shí)函數(shù),假如我要用此芯片延時(shí)300us,該怎么進(jìn)行修改,就在此模式下,就是說怎么計(jì)算?
回復(fù)

使用道具 舉報(bào)

ID:223571 發(fā)表于 2017-9-29 22:12 | 顯示全部樓層
dzbj 發(fā)表于 2017-9-29 19:26
在c下寫這種延時(shí) 設(shè)定好運(yùn)行頻率用c仿真 看經(jīng)過多少時(shí)間 估計(jì)出來的 在c下全c的語句很難精確計(jì)算時(shí)間 不知 ...

這個(gè)其實(shí)在調(diào)試的時(shí)候,可以通過反匯編可以看到執(zhí)行的時(shí)間,關(guān)鍵是怎么設(shè)計(jì)延時(shí),假如我要延時(shí)300us該怎么搞?

回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2017-9-30 00:40 | 顯示全部樓層
簡單,編譯器生成匯編后,就能看出來了。這樣就可以增刪了。
回復(fù)

使用道具 舉報(bào)

ID:236686 發(fā)表于 2017-9-30 01:42 | 顯示全部樓層
有個(gè)調(diào)試的功能  keil  里面     可以看到花了多少時(shí)間
回復(fù)

使用道具 舉報(bào)

ID:164602 發(fā)表于 2017-9-30 08:33 | 顯示全部樓層
這是個(gè)很專業(yè)的問題,我回答不了,但我知道怎么去找答案!
STC的下載軟件,功能是很強(qiáng)大的,其中就有這個(gè)延時(shí)函數(shù)的自動(dòng)生成功能。
在軟件右上角,有很多功能的頁面,其中就有“軟件延時(shí)計(jì)算器”,我截個(gè)圖,你自己看看。
當(dāng)然,如果你是想自己掌握這個(gè)時(shí)間,那我就幫不了你了。

1.jpg
回復(fù)

使用道具 舉報(bào)

ID:104472 發(fā)表于 2017-9-30 11:48 | 顯示全部樓層
反編碼,能夠得到時(shí)間值;
回復(fù)

使用道具 舉報(bào)

ID:155507 發(fā)表于 2017-10-1 13:02 | 顯示全部樓層

  1. void Delay300us()                //@16.000MHz
  2. {
  3.         unsigned char i, j;

  4.         i = 5;
  5.         j = 168;
  6.         do
  7.         {
  8.                 while (--j);
  9.         } while (--i);
  10. }
復(fù)制代碼


  1. DELAY300US:                        ;@16.000MHz
  2.         NOP
  3.         PUSH 30H
  4.         PUSH 31H
  5.         MOV 30H,#4
  6.         MOV 31H,#183
  7. NEXT:
  8.         DJNZ 31H,NEXT
  9.         DJNZ 30H,NEXT
  10.         POP 31H
  11.         POP 30H
  12.         RET
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:207388 發(fā)表于 2017-10-10 15:30 | 顯示全部樓層
void Delay300us()                //@16.000MHz
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表