阅读:1030回复:4
在先求救,希望各位大哥哥大姐姐伸出援助之手,小女子将感激不尽!
我接触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)上是绝对不支持的,我该怎样的修改呢?你们能帮我提一个好的饿建议吗?谢谢!! |
|
沙发#
发布于: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] |
|
|
板凳#
发布于: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; } 这样不就解决问题了吗? |
|
地板#
发布于:2004-09-01 16:04
这是一个函数指针数组,它根据从主机发来的信息索引相应的子函数!
|
|
地下室#
发布于:2004-09-02 10:04
如果你觉得这种方法无法理解也无法接受,那就用jrmforever的方法,用switch和case语句解决
|
|