主题:CAN线程及主线程问题 共有34175人关注过本帖 |
---|
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( )后点全速执行,程序应该会执行到主线程死循环断点处。 |
单帖管理 | 引用 | 回复 |