• slider image 270
  • slider image 271
  • slider image 272
:::


Browsing this Thread:   1 Anonymous Users






使用MCC產生的callback問題
#1
高級會員
高級會員


查看用戶資訊
以Timer為例,它提供了一個callback:
TMR1_SetInterruptHandler(TMR1_1sInterruptHandler);

讓我們可以從
interrupt_manager.c --> tmr1.c --> 自己的.c
主要的好處應該是可以不用修改interrupt_manager.c及tmr1.c就取得中斷

在範例裡面也都直接在callback裡執行流程(但都是些點LED的動作)
但callback function(本例為TMR1_1sInterruptHandler)實際上還是在ISR中,並沒有轉移控制權,只是call了函式跳出來

以前在寫的時候,一直要注意,不要在ISR裡面jump,也不要在裡面做秏時長的工作,但MCC的範例裡完全沒有這種警告,感覺好像你想在callback裡做什麼都行

我今天是看到一個Warning:
non-reentrant function "_XXX_Read" appears in multiple call graphs and has been duplicated by the compiler

即function在ISR即main中都被被執行,才想到我在Timer的callback裡呼叫了函式

你們對callback內進行的操作有什麼額外的說明嗎?

在MCC裡註冊callback,實際上會跳兩次,先到tmr1.c,再到我們的c檔案,這種方式在XC8裡有什麼特殊處理讓它執行不會出問題嗎?


還有MCC產生的code自己就產生了一堆Warning,什麼xxx is never called我就不說了,其它
比如tmr1.c
void TMR1_WriteTimer(uint16_t timerVal)
{
    if (
T1CONbits.nT1SYNC == 1)
    {
        
// Stop the Timer by writing to TMRxON bit
        
T1CONbits.TMR1ON 0;

        
// Write to the Timer1 register
        
TMR1H = (timerVal >> 8);
        
TMR1L timerVal;

        
// Start the Timer after writing to the register
        
T1CONbits.TMR1ON =1;
    }
    else
    {
        
// Write to the Timer1 register
        
TMR1H = (timerVal >> 8);
        
TMR1L timerVal;
    }
}


Warning:
mcc_generated_files/tmr1.c:129:17warningimplicit conversion loses integer precision'uint16_t' (aka 'unsigned short'to 'unsigned char' [-Wconversion]
        
TMR1L timerVal;
              ~ ^~~~~~~~


spi1.c中:
void SPI1_ExchangeBlock(void *blocksize_t blockSize)
{
    
uint8_t *data block;
    while(
blockSize--)
    {
        
SSP1BUF = *data;
        while(!
PIR1bits.SSP1IF);
        
PIR1bits.SSP1IF 0;
        *
data++ = SSP1BUF;
    }
}


Warning:
mcc_generated_files/spi1.c:108:: warning: (1498pointer (SPI1_ExchangeBlock@datain expression may have no targets


自己工具產生的code應該稍微用點心,把這種訊息給處理了吧,

發表於: 12/8 17:13
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 使用MCC產生的callback問題
#2
版主
版主


查看用戶資訊
使用 MCC 的中斷處理最佳方式是是使用 MCC 所產生的 CallBack 方式。當然 CallBack 方式的處理方式是比較複雜一點,底下有一說明是如何宣告及使用 Callback 的函數指標宣告及用法。

有一份 "使用MCC mTouch 的設定,快速完成觸控按鍵實作指導手冊" 裡面有許多的範例就是使用 Callback 的方式來處理中斷功能的。摘錄書中一小段和使用 Timer 的 Callback 函數的方式:

B使用 Timer1 callback 函數方式
在練習一的程式 
(mTouch 16F15355 Polling.X有使用到 Timer1 的 Callback 的中斷調用功能來做
500mS 的計時。Callback 的中斷調用功能對熟悉 C 的工程師是駕輕就熟的工作,可是對初學 C 的工
程師就是件辛苦的事了。MCC 或 HMC 所產生的周邊函數很多都具有 Callback 的功能,對於 MCC 所
產生的周邊函數我們也是儘量的不去修改或增加程式到 MCC 所產生的程式裡,如此可在重新產生
新的 MCC C Code 時可避免忘記修改或復原造成功能執行的錯誤。也就是說不用去修改 MCC 的
Code,只要修改自己的主程式即可。
底下就所使用的 Timer1 Callback 方式做個說明
:
1. 查看 Timer1 的 tmr1.h 裡的函數原型宣告
void TMR1_SetInterruptHandler
(void (* InterruptHandler)(void)); 這是一個用來註冊在中斷期
間所要調用函數的函數
, (以函數指標型式傳入)
2. 接下來要做的是撰寫一個在主程式下的一個中斷處理函數 (MyEvent)
void MyEvent
(void) {
if (
Delay_Count !=0Delay_Count--; // 終端機顯示計時器,每 10mS 遞減
}
程式功能非常簡單,每次 Timer1 發生中斷就會到 MyEvent 函數來執行,將目前的 Delay_Count
減一。
3. 加入該函數 MyEvent
( ) 的原型宣告及 Delay_Count 的變數宣告。要注意的是 Delay_Count 是在中
斷期間所使用到的變數,所以不可忘記要加上 vola
)le 的宣告。
int vola
)le Delay_Count// Timer1 使用到的變數
void MyEvent(void);
4. 最後的工作就是將 MyEvent 的函數指標註冊到前面所提的TMR1_SetInterruptHandler(void (*
InterruptHandler)(void))裡。只要在程式一開始執行後就可以加入 TMR1_SetInterruptHandler
(MyEvent); 的註冊工作。
以上的工作一一完成後,Timer1 Callback 功能就可以實現了。

發表於: 12/9 13:03
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 使用MCC產生的callback問題
#3
版主
版主


查看用戶資訊
剛剛已將中文使用手冊及範例傳到你的 e-mail 了。

發表於: 12/9 13:15
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 使用MCC產生的callback問題
#4
高級會員
高級會員


查看用戶資訊
感謝版大還去找了範例來發給我...

不過callback的操作是沒什麼問題啦,我主要的問題是,
在callback裡的操作,限制至少是和在ISR內操作是一樣的

即不應轉跳,不應執行秏時的工作
以前的建議甚至是,進中斷後,做完必要的接收、狀態設定後就儘快離開,以免影響中斷的觸發

但在MCC裡一點這種提示都沒有,MCC中幾乎所有的範例都直接在callback裡執行動作,但做的都是些簡單的點LED功能(版大給的範例看起來也是改個IO狀態就離開了)
,如果這樣,那也不值得用callback做兩次轉跳,只為了不修改到MCC產生的code

以uart為例,要是在接收的callback中,直接把parser加在後面,
或是在Timer中,把一些定時執行的routine放進去,可能就會因秏時過長而影響中斷?

XC8是會把isr的callback轉成inline嗎,不然怎麼敢做這麼多jump...?

發表於: 12/9 16:05
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 使用MCC產生的callback問題
#5
版主
版主


查看用戶資訊
callback 方式是為了程式的完整性且容易修改,如果直接修改 MCC 所產生的中斷涵數那重新做 code generated 後,原先的中斷程式又會被改回。

使用 callback 當然會影響中斷的響應時間,當然你也可以直接在中斷涵數裡直接攔截中斷,寫你的處理程式,而不用理會 callback.

發表於: 12/10 10:17
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://edm.microchip.com.hk/webapp/opt-in/website/tc/form.htm
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

Microchip CAE 空中教室

教育訓練中心

課程 - 台北教育訓練中心
課程 - 新竹教育訓練中心
課程 - 高雄教育訓練中心
教育訓練中心介紹
購買 - 實驗工具
臺灣實驗板介紹與資源