主题:CAN线程及主线程问题

  共有24593人关注过本帖    
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( )后点全速执行,程序应该会执行到主线程死循环断点处。

  单帖管理 | 引用 | 回复 回到顶部

返回首页

CAN线程及主线程问题

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: