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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8H單片機代碼問題 代碼封裝成函數再調用失敗但是在main中成功運行

[復制鏈接]
跳轉到指定樓層
樓主
ID:554500 發表于 2020-12-15 22:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. for(i=0;i<4;i++)
  2. {
  3.     if((SCH_tasks_G[i].RunMe ==1)&&(SCH_tasks_G[i].Co_op==0))
  4.         {
  5.                 SCH_tasks_G[i].Ptask();
  6.                 SCH_tasks_G[i].RunMe=0;
  7.         }
  8.         if(SCH_tasks_G[i].Period == 0) //如果是單次任務,則刪除
  9.         {
  10.                 SCH_tasks_G[i].Ptask =0;
  11.         }
  12. }
復制代碼

以上代碼封裝成函數再調用,系統不執行。
放在main里就正常了,請問下大家有沒有遇到這樣的問題?        

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

使用道具 舉報

沙發
ID:491577 發表于 2020-12-15 23:06 | 只看該作者
可能是變量的問題,i在函數中定義了嗎?SCH_tasks_G[i].RunM是全局變量嗎?
回復

使用道具 舉報

板凳
ID:554500 發表于 2020-12-16 07:42 | 只看該作者
hhh402 發表于 2020-12-15 23:06
可能是變量的問題,i在函數中定義了嗎?SCH_tasks_G.RunM是全局變量嗎?

i定義了,要不然編譯也不通過 啊,SCH_tasks_G.RunMe是全局變量
以前從來沒遇到過的。
回復

使用道具 舉報

地板
ID:554500 發表于 2020-12-16 08:10 | 只看該作者
hhh402 發表于 2020-12-15 23:06
可能是變量的問題,i在函數中定義了嗎?SCH_tasks_G.RunM是全局變量嗎?

SCH_tasks_G[ i].RunMe函數調用標志位,因為我的函數是周期性調用,所以標志位在定時器中斷服務函數內                                                       被置1的,函數是以函數指針的方式被調用。在main/while里循環檢測各個函數的標志位,等于1就執行,否則就跳過。
回復

使用道具 舉報

5#
ID:748788 發表于 2020-12-16 10:07 | 只看該作者
也可能執行了你沒察覺,不妨在函數里加一句點亮led的語句,是否執行就一目了然了。
回復

使用道具 舉報

6#
ID:554500 發表于 2020-12-16 11:01 | 只看該作者
wwh2382 發表于 2020-12-16 10:07
也可能執行了你沒察覺,不妨在函數里加一句點亮led的語句,是否執行就一目了然了。

st=SCH_Task_Add(LED1,50,50,0,1);
st=SCH_Task_Add(Display_Update,30,30,0,1);
st=SCH_Task_Add(MAX31855_ReadTemper,25,25,0,1);
st=SCH_Task_Add(ADC_ReadVoltage2,30,30,0,1);
代碼里有LED的,用示波器看了,就是沒執行。
還有就是keil代碼優化等級設置為0,它就正常 了。
keil優化等級默認為8.
回復

使用道具 舉報

7#
ID:554500 發表于 2020-12-16 11:08 | 只看該作者
這是工程文件
void main()
{
        u8 xdata st=0,i;
        P_SW2|=0x80; //可以訪問擴展的RAM

        LED_Init();
        Timer1_Init();
        SPI_Init();
        TM1638_Init();
        PWM_Init();
        UART1_Init();
        ADC_Init();
        SCH_Task_Init();

        st=SCH_Task_Add(LED1,50,50,0,1);
        UART1_SendByte(st);
        st=SCH_Task_Add(Display_Update,30,30,0,1);
        UART1_SendByte(st);
        st=SCH_Task_Add(MAX31855_ReadTemper,25,25,0,1);
        UART1_SendByte(st);
        st=SCH_Task_Add(ADC_ReadVoltage2,30,30,0,1);
        UART1_SendByte(st);

        UART1_SendByte((u8)SCH_tasks_G[0].Ptask);
        UART1_SendByte((u8)SCH_tasks_G[1].Ptask);
        UART1_SendByte((u8)SCH_tasks_G[2].Ptask);
        UART1_SendByte((u8)SCH_tasks_G[3].Ptask);

        Timer1_Cmd(ENABLE);


        while(1)
        {
                //SCH_Task_Dispatch();
                for(i=0;i<4;i++)
                {
                        if((SCH_tasks_G[i].RunMe ==1)&&(SCH_tasks_G[i].Co_op==0))
                        {
                         SCH_tasks_G[i].Ptask();
                         SCH_tasks_G[i].RunMe=0;
                        }
                        if(SCH_tasks_G[i].Period == 0) //如果是單次任務,則刪除
                        {
                                SCH_tasks_G[i].Ptask =0;
                        }
                }               
        }
}

封裝成函數SCH_Task_Dispatch(),再調用運行失敗,
直接寫在main/while里面就能運行了!搞不懂

STC8H系列奶茶封口機.zip

168.77 KB, 下載次數: 10

回復

使用道具 舉報

8#
ID:861234 發表于 2020-12-16 12:13 | 只看該作者
將XDATA改為DATA試下吧,只要DATA沒溢出,就盡量用DATA,溢出的部分才用XDATA
回復

使用道具 舉報

9#
ID:226055 發表于 2020-12-16 12:42 | 只看該作者
是否存儲空間在臨界值所致?
回復

使用道具 舉報

10#
ID:554500 發表于 2020-12-16 13:03 | 只看該作者
小牢頭 發表于 2020-12-16 12:13
將XDATA改為DATA試下吧,只要DATA沒溢出,就盡量用DATA,溢出的部分才用XDATA

也不行
回復

使用道具 舉報

11#
ID:554500 發表于 2020-12-16 13:06 | 只看該作者
cocolala 發表于 2020-12-16 12:42
是否存儲空間在臨界值所致?

Program Size: data=34.0 xdata=112 const=17 code=3036

應該不會 ,昨天我打電話給STC的技術員,他讓我把所有的變量設成xdata型,還是不行。
回復

使用道具 舉報

12#
ID:861234 發表于 2020-12-16 14:24 | 只看該作者
volatile u8 xdata SCH_tasks_Count=0;  //添加成功的任務個數

取消最前面的volatile試下
回復

使用道具 舉報

13#
ID:554500 發表于 2020-12-16 14:49 | 只看該作者
小牢頭 發表于 2020-12-16 14:24
volatile u8 xdata SCH_tasks_Count=0;  //添加成功的任務個數

取消最前面的volatile試下

還是不行,晚上換個版本的keil軟件試試,現在用的是keil4
回復

使用道具 舉報

14#
ID:382454 發表于 2020-12-16 16:29 | 只看該作者
全局變量沒有放在這個函數里造成的。
回復

使用道具 舉報

15#
ID:554500 發表于 2020-12-16 18:21 | 只看該作者
univers 發表于 2020-12-16 16:29
全局變量沒有放在這個函數里造成的。

放了的
回復

使用道具 舉報

16#
ID:554500 發表于 2020-12-17 07:58 | 只看該作者
volatile u8 xdata n;                 
//任務調度(放在大循環里)
void SCH_Task_Dispatch()
{         
        for(n = 0;n <SCH_tasks_Count;n++)
        {
                //只調度合作式任務
                if((SCH_tasks_G[n].RunMe ==1)&&(SCH_tasks_G[n].Co_op==0))
                {
                        SCH_tasks_G[n].Ptask();//執行任務
                        SCH_tasks_G[n].RunMe = 0;//清除任務需要執行的標志
                        if(SCH_tasks_G[n].Period == 0) //如果是單次任務,則刪除
                        {
                                SCH_tasks_G[n].Ptask =0;
                        }
                }
        }
}
我把函數里的n由局部變量改成全局變量,暫時正常了。
但是還是想不通,為什么?這里應該用局部變量啊。
我相信很多人也是這樣用的。編程經驗不足。搞不懂。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品久久久 | 99视频网站| 亚洲综合激情网 | 黄色av免费看 | 国产精品福利在线观看 | 在线不欧美| 国产成人av网站 | xxxx色 | 一级肉体全黄裸片 | 精品一区二区免费视频 | 亚洲精品第一页 | 久久精品国产亚洲 | 亚洲午夜天堂 | 亚洲人成在线播放 | 久久天堂网 | 亚洲精品久久久久久久久久久 | 国产精品国产三级国产aⅴ浪潮 | ass亚洲尤物裸体pics | 免费三级网站 | 亚洲综合区 | 黄色影视在线观看 | 欧美黄色片| 男人添女荫道口图片 | 一级片免费播放 | 成人午夜视频在线观看 | 日本一级黄色 | 午夜视频免费在线观看 | av免费播放 | 欧美三级成人 | 精品国产一区二区三区久久久蜜月 | 欧美精品一级片 | 欧美精产国品一二三区 | 免费黄色小视频 | 亚洲精品网站在线观看 | 久久视频一区 | 一级特黄妇女高潮 | 国产精品二区一区二区aⅴ污介绍 | 亚洲色网址 | 欧美精品一级片 | 精品视频一区二区三区 | 亚洲欧美日韩一区二区三区四区 |