cahwlx1982
驱动小牛
驱动小牛
  • 注册日期2004-08-16
  • 最后登录2006-06-17
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1030回复:4

在先求救,希望各位大哥哥大姐姐伸出援助之手,小女子将感激不尽!

楼主#
更多 发布于:2004-08-31 15:27
我接触USB不久,在固件编程的过程中遇到这样一个问题:
  我们都知道USB的标准设备请求和厂商请求都有一个入口地址表,而周立功书上写的程序是针对C51系列的单片机C语言,而我现在用的是D12+PIC18F8720,书上的程序是不可用的!!!
我想了好多方法都不能成功!我不知道是我的理解错误还是用别的方法可以很好的使它在我的程序里正常的运行!!
书上是这样的一段程序:
//USB标准设备请求入口地址指针表:
code void (*StandardDeviceRequest[])(void) =
{
get_status,
clear_feature,
reserved,
set_feature,
reserved,
set_address,
get_descriptor,
reserved,
get_configuration,
set_configuration,
get_interface,
set_interface,
reserved,
reserved,
reserved,
reserved
};

//用户厂商请求
code void (*VendorDeviceRequest[])(void) =
{
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
read_write_register,
reserved,
reserved,
reserved
};

我是这样认为的:get_status,clear_feature ……都是调用的一些子函数,而*StandardDeviceRequest[]是一个指针数组,但是就是不明白,怎么一个指针数组里面能调用子函数呢?而且还是调用那么多!!这个程序在MPLAB IDE(C18)上是绝对不支持的,我该怎样的修改呢?你们能帮我提一个好的饿建议吗?谢谢!!
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-08-31 18:52
建议看一下C语言中的函数指针,其实它就是根据一个INDEX来执行相应的子程序。用汇编如下:
mov a, index
mov    dptr, #StandardDeviceRequest
jmp     @dptr+a

ajmp get_status      
ajmp clear_feature    
ajmp reserved        
ajmp set_feature      
ajmp reserved        
ajmp set_address      
ajmp get_descriptor  
ajmp reserved        
ajmp get_configuration
ajmp set_configuration
ajmp get_interface    
ajmp set_interface    
ajmp reserved        
ajmp reserved        
ajmp reserved        
ajmp reserved        


[编辑 -  8/31/04 by  lejianz]
一起交流,共同提高!
jrmforever
驱动牛犊
驱动牛犊
  • 注册日期2004-07-24
  • 最后登录2010-05-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-31 19:02
hahaha,这就是我前一阵的问题

哈哈哈,,用选择语句啊,我的编译器也不支持这种格式


所以想了一种方法
void control_handler()
{
   unsigned int i,j;
   unsigned char type, req;
type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;

   if (type == USB_STANDARD_REQUEST)
标准请求

      switch (req)
    {
     case 0:
     get_status();
     break;
     case 1:
     clear_feature();
      break;
     case 2:
      reserved();
      break;
     case 3:
  ;
     set_feature();

      break;
     case 4:
     reserved();
      break;
     case 5:
     set_address();
      break;
     case 6:
     get_descriptor();
      break;
     case  7:
     reserved();
      break;
     case  8:
set_configuration();
      break;
     case  9:
     get_configuration();
      break;
     case  10:
     get_interface();
      break;
     case  11:
     set_interface();
      break;
     case  12:
     reserved();
      break;
     case  13:
     reserved();
      break;
     case  14:
     reserved();
      break;
     case  15:
     reserved();
      break;
        default:
 break;

      }


这样不就解决问题了吗?


xingruichuan
驱动牛犊
驱动牛犊
  • 注册日期2004-08-27
  • 最后登录2007-09-15
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-01 16:04
这是一个函数指针数组,它根据从主机发来的信息索引相应的子函数!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-02 10:04
如果你觉得这种方法无法理解也无法接受,那就用jrmforever的方法,用switch和case语句解决
游客

返回顶部