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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6531|回復: 35
收起左側

C語言如何讓兩個步長不一樣的FOR循環(huán)同時執(zhí)行?

  [復制鏈接]
ID:653173 發(fā)表于 2020-7-14 08:46 | 顯示全部樓層 |閱讀模式
C如何讓兩個步長不一樣的FOR循環(huán)同時執(zhí)行?互不干擾,求大俠指點

void main()                                       
{            
        uchar i,j;

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

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



回復

使用道具 舉報

ID:331263 發(fā)表于 2020-7-14 09:47 | 顯示全部樓層
void main()                                       
{            
        uchar i;

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

評分

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

查看全部評分

回復

使用道具 舉報

ID:653173 發(fā)表于 2020-7-14 10:20 | 顯示全部樓層
dingpeng1980 發(fā)表于 2020-7-14 09:47
void main()                                       
{            
        uchar i;

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

使用道具 舉報

ID:142320 發(fā)表于 2020-7-14 12:12 | 顯示全部樓層
你對C語言和編程的理解有誤,我們?yōu)槭裁窗褍蓚不同for要同步,你要實現(xiàn)這個的目的是為了什么。否則都是無意義的問題。
回復

使用道具 舉報

ID:653173 發(fā)表于 2020-7-14 12:41 | 顯示全部樓層
gujp312365 發(fā)表于 2020-7-14 12:12
你對C語言和編程的理解有誤,我們?yōu)槭裁窗褍蓚不同for要同步,你要實現(xiàn)這個的目的是為了什么。否則都是無意 ...

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

使用道具 舉報

ID:451718 發(fā)表于 2020-7-14 15:08 | 顯示全部樓層
做時間定標,用定時器來實現(xiàn)。   基于硬件的編程,不要老想著用算法來搞。   程序?qū)懙迷倩ǎ痪幾g就給你優(yōu)化了。
回復

使用道具 舉報

ID:451718 發(fā)表于 2020-7-14 15:09 | 顯示全部樓層
做時間定標,然后在定時器里面去實現(xiàn)。   面向硬件的編程,不要老實想著算法, 程序再花,一編譯就優(yōu)化了

評分

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

查看全部評分

回復

使用道具 舉報

ID:451718 發(fā)表于 2020-7-14 15:10 | 顯示全部樓層
void tm0_isr() interrupt 1         //中斷入口
{
        SysTick++;
回復

使用道具 舉報

ID:451718 發(fā)表于 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;
    ...........

   }
}
回復

使用道具 舉報

ID:735148 發(fā)表于 2020-7-14 15:14 | 顯示全部樓層
嚴格意義上的同時,只能執(zhí)行一個;
你可以利用定時器定時,一個主要執(zhí)行,另外一個隔一段時間執(zhí)行一段,只要時間設置的足夠短,就可以理解為同時執(zhí)行。
回復

使用道具 舉報

ID:636538 發(fā)表于 2020-7-14 15:28 | 顯示全部樓層
soaic 發(fā)表于 2020-7-14 12:41
循環(huán)體1的輸出與i有關,循環(huán)體2的輸出與J有關。,比如P1口控制流水燈,P1口同時控制8段碼

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

評分

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

查看全部評分

回復

使用道具 舉報

ID:553941 發(fā)表于 2020-7-14 15:28 | 顯示全部樓層
這個問題問的,for循環(huán)本來就是要執(zhí)行完內(nèi)部的程序才能跳出,兩個for肯定是兩個單獨的。優(yōu)化你的邏輯吧,另外,單片機同一時刻只能做一件事
回復

使用道具 舉報

ID:639106 發(fā)表于 2020-7-14 19:59 | 顯示全部樓層
C不允許兩條或兩條以上的語句同時執(zhí)行,你可以用定時器來切換這兩個for循環(huán)
回復

使用道具 舉報

ID:284454 發(fā)表于 2020-7-14 20:17 | 顯示全部樓層
void main()                                       
{            
        uchar i,j,k=1;

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

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

使用道具 舉報

ID:332444 發(fā)表于 2020-7-14 21:08 | 顯示全部樓層
比如P1口控制流水燈,P1口同時控制8段碼,沒說明清楚是要怎樣控制,數(shù)碼管顯示0-9?流水燈從左到右?
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-7-14 21:16 | 顯示全部樓層
所謂同時也可以理解為多任務當然也是存在前后一個機器周期的,真正的同時也是可以的,就是用同一個計數(shù)達到不同值時的不同處理,比如i計數(shù)到8就執(zhí)行再到15就執(zhí)行可視為同時。
回復

使用道具 舉報

ID:592807 發(fā)表于 2020-7-15 08:31 | 顯示全部樓層
看了一圈不知道你要要什么東西。講一下自己的了理解吧。i和j要相互獨立而 i是8循環(huán)j是15循環(huán)的對吧
i = 0 j = 0
i = 1 j =1
.
.
.
i = 7 j = 7
i = 0 j = 8.
.
.

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

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

使用道具 舉報

ID:331263 發(fā)表于 2020-7-15 08:51 | 顯示全部樓層
重點看周期,如果小于循環(huán)周期就認為是同時運行,大于循環(huán)周期就提高時鐘頻率,在不夠用就只有換cpu了
回復

使用道具 舉報

ID:331263 發(fā)表于 2020-7-15 08:55 | 顯示全部樓層
soaic 發(fā)表于 2020-7-14 12:41
循環(huán)體1的輸出與i有關,循環(huán)體2的輸出與J有關。,比如P1口控制流水燈,P1口同時控制8段碼

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

使用道具 舉報

ID:331263 發(fā)表于 2020-7-15 09:02 | 顯示全部樓層
dingpeng1980 發(fā)表于 2020-7-15 08:55
你這不是總線通訊原理么?你還要一個時鐘線,看看IIC通訊原理吧

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

使用道具 舉報

ID:282850 發(fā)表于 2020-7-15 10:03 | 顯示全部樓層
問題很是怪,程序是順序執(zhí)行的,這是基本思想,再加上中斷。但永遠不可能同時執(zhí)行
回復

使用道具 舉報

ID:311846 發(fā)表于 2020-7-15 11:43 | 顯示全部樓層
非多核芯片做不到同時執(zhí)行,無論多NB的單核芯片都是受時間輪執(zhí)行的,單片機允許時間誤差內(nèi)一般當做同時執(zhí)行處理,如UCOSII之類的多線程也是有時間差的,主要是看做什么,了解原理,才能編寫相應的程序
回復

使用道具 舉報

ID:653173 發(fā)表于 2020-7-16 10:10 | 顯示全部樓層
xianfajushi 發(fā)表于 2020-7-14 21:08
比如P1口控制流水燈,P1口同時控制8段碼,沒說明清楚是要怎樣控制,數(shù)碼管顯示0-9?流水燈從左到右?

是的。。。。
回復

使用道具 舉報

ID:653173 發(fā)表于 2020-7-16 10:12 | 顯示全部樓層
本帖最后由 soaic 于 2020-7-16 10:18 編輯
ko44 發(fā)表于 2020-7-14 20:17
void main()                                       
{            
        uchar i,j,k=1;

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

使用道具 舉報

ID:653173 發(fā)表于 2020-7-16 10:27 | 顯示全部樓層
本帖最后由 soaic 于 2020-7-16 10:30 編輯
黃youhui 發(fā)表于 2020-7-15 08:31
看了一圈不知道你要要什么東西。講一下自己的了理解吧。i和j要相互獨立而 i是8循環(huán)j是15循環(huán)的對吧
i = 0  ...

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

使用道具 舉報

ID:473925 發(fā)表于 2020-7-16 10:37 | 顯示全部樓層
如果真正意義上的同時 ,要用FPGA 來做
回復

使用道具 舉報

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

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

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

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


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

使用道具 舉報

ID:653173 發(fā)表于 2020-7-16 14:14 | 顯示全部樓層
本帖最后由 soaic 于 2020-7-16 14:51 編輯
黃youhui 發(fā)表于 2020-7-15 08:31
看了一圈不知道你要要什么東西。講一下自己的了理解吧。i和j要相互獨立而 i是8循環(huán)j是15循環(huán)的對吧
i = 0  ...

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

使用道具 舉報

ID:332444 發(fā)表于 2020-7-16 16:45 | 顯示全部樓層

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

使用道具 舉報

ID:804329 發(fā)表于 2020-7-16 16:54 | 顯示全部樓層
使用定時器中斷就行,在main函數(shù)執(zhí)行一個語句,在中斷服務函數(shù)執(zhí)行另一個。把中斷服務函數(shù)進入間隔調(diào)小點就能看成同時進行。這就是前后臺系統(tǒng)。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-7-16 16:55 | 顯示全部樓層
當然執(zhí)行肯定是分時的,單核不可能實現(xiàn)并行,只能說使用手段可以實現(xiàn)一個P多重復用,且在時間安排允許的范圍內(nèi)。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-7-16 17:02 | 顯示全部樓層
我寫的示例有用一個循環(huán)控制2種不同的延時,這很容易實現(xiàn),但不是你要實現(xiàn)的目標,因此說你描述不夠清楚,你要實現(xiàn)的功能不是用并行循環(huán)去實現(xiàn)的。
回復

使用道具 舉報

ID:653173 發(fā)表于 2020-7-17 11:02 | 顯示全部樓層
1692483014 發(fā)表于 2020-7-16 12:01
兄弟,雖然你的表述不是很清晰,大家都不太好理解你要具體做什么,但我基本理解你要干什么了。
我想你是想 ...

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

使用道具 舉報

ID:280512 發(fā)表于 2020-7-17 14:22 | 顯示全部樓層
單片機硬件的工作就是由時鐘同步,去一個周期一個周期的去執(zhí)行指令。在一個cpu的條件下。不可能一個脈沖去執(zhí)行兩個指令
回復

使用道具 舉報

ID:804733 發(fā)表于 2020-7-17 14:30 | 顯示全部樓層
定時器或者使用操作系統(tǒng)(RTOS)
回復

使用道具 舉報

ID:284454 發(fā)表于 2020-7-17 22:56 | 顯示全部樓層
soaic 發(fā)表于 2020-7-16 10:12
提供了一個很好的方法,謝謝!但是上述代碼還是不能跳出循環(huán),不能實現(xiàn)P0口跑馬燈移位的同時,P1口數(shù)碼管 ...

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色视频在线播放 | 孰女乱色一区二区三区 | 日韩免费一区 | 污污免费网站 | 日韩日b视频| 国产精品精品视频一区二区三区 | 免费在线一区二区三区 | 一区在线视频 | 久久久精品一区二区 | 国产视频一区二区 | 精品一区二区av | 国产精品视频一二三区 | 欧美日韩在线一区二区 | 成人高清在线视频 | 国产一级视频在线观看 | 婷婷激情综合 | 欧美αv | 久久亚洲欧美日韩精品专区 | 亚洲精品自在在线观看 | 日本电影韩国电影免费观看 | 韩日一区二区 | 日韩一区中文字幕 | 国产区在线看 | 婷婷桃色网 | 精品久久久久久久 | 亚洲视频中文字幕 | 国产一区二区精品在线观看 | 久久av一区 | 亚洲福利一区二区 | av在线一区二区三区 | 国产在线视频一区 | 欧美久久精品一级c片 | 99欧美精品 | 久久成人18免费网站 | 91精品国产欧美一区二区成人 | 欧美成年黄网站色视频 | 欧美在线播放一区 | 日韩精品在线网站 | 成人在线免费观看视频 | 在线视频一区二区三区 | 欧美一级高清片 |