主題:CAN線程及主線程問題 共有39023人關注過本帖 |
---|
hohai |
1樓 |
CAN線程及主線程問題 Post By:2009-12-27 14:44:00 [只看該作者]
// CANTest.cpp : Defines the entry point for the application.
// #include "stdafx.h" #include "lcd_api.h" #include "EM9260_CAN.h" #include "EM9260_Key.h"  static void CALLBACK OnReceive( ); static void CALLBACK OnError( ); class CEM9260_CAN  m_CAN; int    type; ULONG  ReceiveLen; ULONG  SendLen; unsigned char TxBuf[13]; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int       nCmdShow) {   // TODO: Place code here.   // TODO: Place code here. BOOL    bResult;     HANDLE  hKey; HANDLE  hKeyEvent; ULONG   WaitReturn; int     KeyCode; char    str[100]; UCHAR   Baud; UCHAR   Filter[9]; int     i1; // Start & Init LCD type = LCD_Init( LCD_AUTO ); if( type>0 ) { LCD_WriteString( 8, 0, "CANTest v1.0", 1 ); } // fill AcceptanceFilter<|>s parameters Filter[0] = 0; Filter[1] = 0x5f; Filter[2] = 0; Filter[3] = 0x1f; Filter[4] = 0xff; Filter[5] = 0xff; Filter[6] = 0xff; Filter[7] = 0xff; Filter[8] = DUAL_FILTER_MODE; Baud = CAN_TIMING_250K;    bResult = m_CAN.StartCAN( 1, Baud, (BYTE*)Filter, 9 ); if( bResult==FALSE ) return -1; m_CAN.OnRead = OnReceive; m_CAN.OnError = OnError; ReceiveLen = 0; SendLen = 0; TxBuf[0]=0x42;          TxBuf[1]=0x1f; TxBuf[2]=0x00; for(  ) {    if( type>0 )  //沒收到CAN數據時,在此處死循環   {     sprintf( str, "0x%04x", KeyCode );     LCD_WriteString( 8, 48, str, 1 );   } } m_CAN.StopCAN( ); return 0; } void CALLBACK OnReceive( ) { char     RxBuf[14]; char     str[200]; UCHAR    dlen;     memcpy( RxBuf, &m_CAN.RxMFrame, 13 ); dlen = RxBuf[0]&0x0f; if( RxBuf[0]&0x80 ) // 擴展幀 { m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+5 ); } else // 標準幀 { m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+3 ); } ReceiveLen += dlen; SendLen += dlen; if( type>0 ) { sprintf( str, "RCV: %ld    ", ReceiveLen ); LCD_WriteString( 8, 16, str, 1 ); sprintf( str, "Send: %ld   ", SendLen ); LCD_WriteString( 8, 32, str, 1 ); } } 以上為公司提供的CANTest例程函數 問題如下: 沒收到CAN數據時,在主線程標注處死循環 收到一幀CAN數據,單步調試,執行CANOnReceive( ) 在執行CANOnReceive( )響應完CAN線程后,CAN線程應該掛起。此時應該跳至主線程(文中標注處)死循環執行主線程。但單步調試,顯示”All Threads are suspended“ 公司寫的CAN線程處理函數,響應CAN線程時,是否將主線程人為掛起?還是其他原因? |
|
單帖管理 | 引用 | 回復 |
lqk |
2樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2009-12-27 17:14:00 [只看該作者]
單步調試時,線程可能不能正常切換。
你可以在主線程死循環處設置斷點,調試執行CANOnReceive( )后點全速執行,程序應該會執行到主線程死循環斷點處。 |
單帖管理 | 引用 | 回復 |