主題:CAN線程及主線程問(wèn)題 共有39021人關(guān)注過(guò)本帖 |
---|
hohai |
1樓 |
CAN線程及主線程問(wèn)題 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 )  //沒(méi)收到CAN數(shù)據(jù)時(shí),在此處死循環(huán)   {     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 ) // 擴(kuò)展幀 { m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+5 ); } else // 標(biāo)準(zhǔn)幀 { 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例程函數(shù) 問(wèn)題如下: 沒(méi)收到CAN數(shù)據(jù)時(shí),在主線程標(biāo)注處死循環(huán) 收到一幀CAN數(shù)據(jù),單步調(diào)試,執(zhí)行CANOnReceive( ) 在執(zhí)行CANOnReceive( )響應(yīng)完CAN線程后,CAN線程應(yīng)該掛起。此時(shí)應(yīng)該跳至主線程(文中標(biāo)注處)死循環(huán)執(zhí)行主線程。但單步調(diào)試,顯示”All Threads are suspended“ 公司寫的CAN線程處理函數(shù),響應(yīng)CAN線程時(shí),是否將主線程人為掛起?還是其他原因? |
|
單帖管理 | 引用 | 回復(fù) |
lqk |
2樓 信息 | 搜索 | 郵箱 |
加好友 發(fā)短信 |
Post By:2009-12-27 17:14:00 [只看該作者]
單步調(diào)試時(shí),線程可能不能正常切換。
你可以在主線程死循環(huán)處設(shè)置斷點(diǎn),調(diào)試執(zhí)行CANOnReceive( )后點(diǎn)全速執(zhí)行,程序應(yīng)該會(huì)執(zhí)行到主線程死循環(huán)斷點(diǎn)處。 |
單帖管理 | 引用 | 回復(fù) |