欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C語言如何讓兩個步長不一樣的FOR循環同時執行?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:653173 發表于 2020-7-14 08:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
C如何讓兩個步長不一樣的FOR循環同時執行?互不干擾,求大俠指點

void main()                                       
{            
        uchar i,j;

        while(1)
        {
//            for(i=0,j=0;i<8||j<15;i++,j++)  
              for(i=0;i<8;i++)
                {
               //循環體1
                }

                for(j=0;j<15;j++)
                {               
                //循環體2
                }
         }
        
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:331263 發表于 2020-7-14 09:47 | 只看該作者
void main()                                       
{            
        uchar i;

        while(1)
        {
                for(i=0;i<15;i++)
                {  
                    if((i*2)<15)   
                    {
                   //循環體1
                    }           
                   //循環體2
                }
         }      
}

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:653173 發表于 2020-7-14 10:20 | 只看該作者
dingpeng1980 發表于 2020-7-14 09:47
void main()                                       
{            
        uchar i;

if語句嵌套也不行啊,一個步長是8,一個是15,兩個要隨時都能運行。這樣還是有一段時間循環體1沒有繼續執行,在等待循環體2執行完畢15個步長
回復

使用道具 舉報

地板
ID:142320 發表于 2020-7-14 12:12 | 只看該作者
你對C語言和編程的理解有誤,我們為什么把兩個不同for要同步,你要實現這個的目的是為了什么。否則都是無意義的問題。
回復

使用道具 舉報

5#
ID:653173 發表于 2020-7-14 12:41 | 只看該作者
gujp312365 發表于 2020-7-14 12:12
你對C語言和編程的理解有誤,我們為什么把兩個不同for要同步,你要實現這個的目的是為了什么。否則都是無意 ...

循環體1的輸出與i有關,循環體2的輸出與J有關。,比如P1口控制流水燈,P1口同時控制8段碼
回復

使用道具 舉報

6#
無效樓層,該帖已經被刪除
7#
無效樓層,該帖已經被刪除
8#
ID:451718 發表于 2020-7-14 15:08 | 只看該作者
做時間定標,用定時器來實現。   基于硬件的編程,不要老想著用算法來搞。   程序寫得再花,一編譯就給你優化了。
回復

使用道具 舉報

9#
ID:451718 發表于 2020-7-14 15:09 | 只看該作者
做時間定標,然后在定時器里面去實現。   面向硬件的編程,不要老實想著算法, 程序再花,一編譯就優化了

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

10#
ID:451718 發表于 2020-7-14 15:10 | 只看該作者
void tm0_isr() interrupt 1         //中斷入口
{
        SysTick++;
回復

使用道具 舉報

11#
ID:451718 發表于 2020-7-14 15:14 | 只看該作者
void tm0_isr() interrupt 1         //中斷入口
{
        SysTick++;
}

void main()
{
    switch(SysTick%8)
   {
        case 0:
            i= 0;
            j= 0;
            j= 1;
        break;
        case 1:
            i= 1;
            j= 2;
            j= 3;
        break;
        case 2:
            i= 2;
            j= 4;
            j= 5;
       break;
    ...........

   }
}
回復

使用道具 舉報

12#
ID:735148 發表于 2020-7-14 15:14 | 只看該作者
嚴格意義上的同時,只能執行一個;
你可以利用定時器定時,一個主要執行,另外一個隔一段時間執行一段,只要時間設置的足夠短,就可以理解為同時執行。
回復

使用道具 舉報

13#
ID:636538 發表于 2020-7-14 15:28 | 只看該作者
soaic 發表于 2020-7-14 12:41
循環體1的輸出與i有關,循環體2的輸出與J有關。,比如P1口控制流水燈,P1口同時控制8段碼

在我這看來,這個本身就不能同時,你的理解有誤,雖然IO復用,但是是不同時間的使用,單片機執行的速度讓你感覺在同時執行

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

14#
ID:553941 發表于 2020-7-14 15:28 | 只看該作者
這個問題問的,for循環本來就是要執行完內部的程序才能跳出,兩個for肯定是兩個單獨的。優化你的邏輯吧,另外,單片機同一時刻只能做一件事
回復

使用道具 舉報

15#
ID:639106 發表于 2020-7-14 19:59 | 只看該作者
C不允許兩條或兩條以上的語句同時執行,你可以用定時器來切換這兩個for循環
回復

使用道具 舉報

16#
ID:284454 發表于 2020-7-14 20:17 | 只看該作者
void main()                                       
{            
        uchar i,j,k=1;

        while(1)
        {
            if(k==1)

              for(i=0;i<8;i++)
                {
               //循環體1
                k=0
                }
           else
                for(j=0;j<15;j++)
                {               
                //循環體2
               k=1
                }
         }
        
}
c單個處理器永遠沒有同時同步的,只是無限接近同時同步,都是一步一步執行,切換快而已。
引入一個數,相當于正反轉,每個循環執行一次就切換另一個循環。
中間忽略了幾個指令周期,看看是不是和你的意思。
回復

使用道具 舉報

17#
ID:332444 發表于 2020-7-14 21:08 | 只看該作者
比如P1口控制流水燈,P1口同時控制8段碼,沒說明清楚是要怎樣控制,數碼管顯示0-9?流水燈從左到右?
回復

使用道具 舉報

18#
ID:332444 發表于 2020-7-14 21:16 | 只看該作者
所謂同時也可以理解為多任務當然也是存在前后一個機器周期的,真正的同時也是可以的,就是用同一個計數達到不同值時的不同處理,比如i計數到8就執行再到15就執行可視為同時。
回復

使用道具 舉報

19#
ID:592807 發表于 2020-7-15 08:31 | 只看該作者
看了一圈不知道你要要什么東西。講一下自己的了理解吧。i和j要相互獨立而 i是8循環j是15循環的對吧
i = 0 j = 0
i = 1 j =1
.
.
.
i = 7 j = 7
i = 0 j = 8.
.
.

i = 6 j = 14
i = 7 j = 0

這樣循環的對吧,你用取余數方法就可以得到你要的結果。
for(k = 0;k <120;k++)
i = k % 8;
j = k % 15;
i和j的值同時增大循環,取值相互獨立。
回復

使用道具 舉報

20#
ID:331263 發表于 2020-7-15 08:51 | 只看該作者
重點看周期,如果小于循環周期就認為是同時運行,大于循環周期就提高時鐘頻率,在不夠用就只有換cpu了
回復

使用道具 舉報

21#
ID:331263 發表于 2020-7-15 08:55 | 只看該作者
soaic 發表于 2020-7-14 12:41
循環體1的輸出與i有關,循環體2的輸出與J有關。,比如P1口控制流水燈,P1口同時控制8段碼

你這不是總線通訊原理么?你還要一個時鐘線,看看IIC通訊原理吧
回復

使用道具 舉報

22#
ID:331263 發表于 2020-7-15 09:02 | 只看該作者
dingpeng1980 發表于 2020-7-15 08:55
你這不是總線通訊原理么?你還要一個時鐘線,看看IIC通訊原理吧

簡單點的增加1個使能口,一個高使能一個低使能就能驅動2個了,這不是程序的問題你要搞懂原理
回復

使用道具 舉報

23#
ID:282850 發表于 2020-7-15 10:03 | 只看該作者
問題很是怪,程序是順序執行的,這是基本思想,再加上中斷。但永遠不可能同時執行
回復

使用道具 舉報

24#
ID:311846 發表于 2020-7-15 11:43 | 只看該作者
非多核芯片做不到同時執行,無論多NB的單核芯片都是受時間輪執行的,單片機允許時間誤差內一般當做同時執行處理,如UCOSII之類的多線程也是有時間差的,主要是看做什么,了解原理,才能編寫相應的程序
回復

使用道具 舉報

25#
ID:653173 發表于 2020-7-16 10:10 | 只看該作者
xianfajushi 發表于 2020-7-14 21:08
比如P1口控制流水燈,P1口同時控制8段碼,沒說明清楚是要怎樣控制,數碼管顯示0-9?流水燈從左到右?

是的。。。。
回復

使用道具 舉報

26#
ID:653173 發表于 2020-7-16 10:12 | 只看該作者
本帖最后由 soaic 于 2020-7-16 10:18 編輯
ko44 發表于 2020-7-14 20:17
void main()                                       
{            
        uchar i,j,k=1;

提供了一個很好的方法,謝謝!但是上述代碼還是不能跳出循環,不能實現P0口跑馬燈移位的同時,P1口數碼管0-9顯示
回復

使用道具 舉報

27#
ID:653173 發表于 2020-7-16 10:27 | 只看該作者
本帖最后由 soaic 于 2020-7-16 10:30 編輯
黃youhui 發表于 2020-7-15 08:31
看了一圈不知道你要要什么東西。講一下自己的了理解吧。i和j要相互獨立而 i是8循環j是15循環的對吧
i = 0  ...

謝謝大俠,利用公約數取余的方法解決了同步執行的問題,類似天干地支計年;代碼也簡單,牛。。!
回復

使用道具 舉報

28#
ID:473925 發表于 2020-7-16 10:37 | 只看該作者
如果真正意義上的同時 ,要用FPGA 來做
回復

使用道具 舉報

29#
ID:804115 發表于 2020-7-16 12:01 | 只看該作者
兄弟,雖然你的表述不是很清晰,大家都不太好理解你要具體做什么,但我基本理解你要干什么了。
我想你是想問,當我們編程時,想讓多個任務同時運行應該怎么編程,且在各個任務運行時盡可能互不影響,對吧?
首先,絕對的不影響是不可能的,因為mcu一般都是單核的,同一時間,一個指令周期只能執行一條命令。但我們還是可以做到通過肉眼看兩個任務是同時運行的。比如流水燈和數碼管顯示,因為他們都是控制io翻轉,耗時很小。
解決方法有兩種:一種就是借助OS系統,可以簡化代碼,但需要熟悉OS系統;另外一種就是通過大循環里的標記判斷; OS的就不說了,下面針對大循環舉例說明一下:
基本思想:各個任務在寫代碼的形式上保持獨立性,這樣便于后期代碼維護,同時要讓各個任務之間的互相影響達到最小。
基本手段:拆分每個耗時的任務,每次大循環只執行拆分大任務后的一個個小部分。
       
       
unsigned char LedCnt=0,SmgCnt=0;

void led_handler(void)
{
  if(LedCnt < 8)
  {
    //循環體1   
  }else
  {
    LedCnt = 0;
  }
  LedCnt ++;
}

void shu_ma_guan_handler(void)
{
  if(SmgCnt < 8)
  {
    //循環體2
  }else
  {
    SmgCnt = 0;
  }
  SmgCnt ++;  
}

while(1)
{
  led_handler();
  shu_ma_guan_handler();
}


如果我理解錯誤,沒有及時看到,可以給我qq發郵件,qq號如名。
回復

使用道具 舉報

30#
ID:653173 發表于 2020-7-16 14:14 | 只看該作者
本帖最后由 soaic 于 2020-7-16 14:51 編輯
黃youhui 發表于 2020-7-15 08:31
看了一圈不知道你要要什么東西。講一下自己的了理解吧。i和j要相互獨立而 i是8循環j是15循環的對吧
i = 0  ...

最大公約數取余,相當于天干地支紀年,這是最簡單的實現辦法。但是要滿足步長8和15,公約數還得增加一下
for(k=0;k<144;k++)         //最大公約數取余同時執行
  {
      i=k%9;
      j=k%16;
     //原P0口循環體
     //原P1口循環體
    delay(500);
}
回復

使用道具 舉報

31#
ID:332444 發表于 2020-7-16 16:45 | 只看該作者
soaic 發表于 2020-7-16 10:10
是的。。。。

之前我回復過一個帖子,說明了一個P加一片鎖存器就可以實現對8位數碼管的控制,你的描述還是不夠清楚,說要控制8段碼是指只給數碼管的段值而不控制數碼管的位?
可以明確回復你的是可以實現的加1片鎖存器即可解放P,若用2片鎖存器可實現控制數碼管的段和位,同時也能實現流水燈。
回復

使用道具 舉報

32#
ID:804329 發表于 2020-7-16 16:54 | 只看該作者
使用定時器中斷就行,在main函數執行一個語句,在中斷服務函數執行另一個。把中斷服務函數進入間隔調小點就能看成同時進行。這就是前后臺系統。
回復

使用道具 舉報

33#
ID:332444 發表于 2020-7-16 16:55 | 只看該作者
當然執行肯定是分時的,單核不可能實現并行,只能說使用手段可以實現一個P多重復用,且在時間安排允許的范圍內。
回復

使用道具 舉報

34#
ID:332444 發表于 2020-7-16 17:02 | 只看該作者
我寫的示例有用一個循環控制2種不同的延時,這很容易實現,但不是你要實現的目標,因此說你描述不夠清楚,你要實現的功能不是用并行循環去實現的。
回復

使用道具 舉報

35#
ID:653173 發表于 2020-7-17 11:02 | 只看該作者
1692483014 發表于 2020-7-16 12:01
兄弟,雖然你的表述不是很清晰,大家都不太好理解你要具體做什么,但我基本理解你要干什么了。
我想你是想 ...

這也可以,但是要把兩個LedCnt ++;、 SmgCnt ++;  放在循環體下一行
回復

使用道具 舉報

36#
ID:280512 發表于 2020-7-17 14:22 | 只看該作者
單片機硬件的工作就是由時鐘同步,去一個周期一個周期的去執行指令。在一個cpu的條件下。不可能一個脈沖去執行兩個指令
回復

使用道具 舉報

37#
ID:804733 發表于 2020-7-17 14:30 | 只看該作者
定時器或者使用操作系統(RTOS)
回復

使用道具 舉報

38#
ID:284454 發表于 2020-7-17 22:56 | 只看該作者
soaic 發表于 2020-7-16 10:12
提供了一個很好的方法,謝謝!但是上述代碼還是不能跳出循環,不能實現P0口跑馬燈移位的同時,P1口數碼管 ...

代碼只是弄了個接近同步的循環而已,每個循環需要執行什么任務,在單個循環里面再編輯功能。就跟單片機新手教程里講的跑馬燈以及數碼管的實現一樣就行了。
如果連一個單片機單獨實現跑馬燈都不會,還是再取復習下吧,遺忘那么多,再學新的沒用的。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表