好吧,我想我需要另外一双眼睛来看看这个.我正在对远程服务器上的echo Web服务进行简单的php soapclient调用.我很确定我没有任何拼写错误,而且函数调用是正确的.但是,我收到一个致命的错误声称该函数不是一个有效的方法.下面是Web服务类型的var_dump.
array(4){[0] => string(88)"struct EspException {string Code; string Audience; string Source; string Message;}"[1] => string(71)"struct ArrayOfEspException {string Source; EspException Exception ;}"[2] => string(43)"struct EchoTestRequest {string ValueIn;}"[3] => string(45)"struct EchoTestResponse {string ValueOut;}"}
致命错误:未捕获的SoapFault异常:[客户端]函数("EchoTestRequest")不是/home/grafixst/public_html/cpaapp/echo_test.php:38中此服务的有效方法.堆栈跟踪:#0/home/grafixst/public_html /cpaapp/echo_test.php(38):SoapClient - > __ call('EchoTestRequest',Array)#1 /home/grafixst/public_html/cpaapp/echo_test.php(38):SoapClientAuth-> EchoTestRequest(Array)#2 {main }在第38行的/home/grafixst/public_html/cpaapp/drew/echo_test.php中抛出
这是我用来拨打电话的代码:
require_once('SoapClientAuth.php');
ini_set("soap.wsdl_cache_enabled", "0");
#- Loading the WSDL document
$server = "https://wsonline.seisint.com/WsAccurint/EchoTest?ver_=1.65";
$wsdl = $server . "&wsdl";
$client = new SoapClientAuth($wsdl,
array(
'login' => $username,
'password' => $password
));
$types = $client->__getTypes();
var_dump($types);
echo "</br>";
$req = …Run Code Online (Sandbox Code Playgroud) 我正在编写一个与VHDL中定义的许多寄存器接口的应用程序.寄存器为32位宽,并分配成组.我为该组的每个成员提供了组的基址和32位偏移量.以下是一个组的示例,组内的寄存器和寄存器的结构.


目前,使用以下位字段结构处理I/O,
typedef struct
{
uint32_t data0 : 12;
uint32_t data1 : 1;
...
}volatile data_port;
Run Code Online (Sandbox Code Playgroud)
并使用指向地址的指针修改字段,
data_port *const p_data = (data_port *)0xc006380;
Run Code Online (Sandbox Code Playgroud)
虽然这可能在这个平台上有效,但是对于当前的编译器,我担心可移植性.我想知道在强制使用这些非常规数据类型时是否有更好的方法来处理硬件接口?
我能想到的另一种选择是在硬件和寄存器结构之间创建另一层,使用易失性无符号int指针,并在应用层中使用位域结构.问题是,数据仍然必须从位字段(可能在另一个平台上以不同方式对齐)复制到int,这可能是另一个主题.
编辑:
我认为我真正想要的是一种消除位域使用的方法.将具有位字段成员的结构映射到硬件实际上似乎是一种糟糕的方法.所以,为了消除这一点,我将使用以下之一作为指向易失性存储器地址的指针,
#define PeripheralBase ((uint32_t volatile *)BASE)
Run Code Online (Sandbox Code Playgroud)
要么
uint32_t volatile *const peripheral_base = (uint32_t *) BASE;
Run Code Online (Sandbox Code Playgroud)
希望,一旦我达到这一点,一切都将在32位内完全一致.我想要做的一个方法是创建相同的data_port结构,但是删除位打包,然后右边一个函数专门为每个寄存器将位移位到unsigned int,然后可以使用它传递给寄存器易失性指针.
就像是,
static inline uint32_t struct_to_uint(data_port *data)
{
return data->data0
+ ((uint32_t)data->data1 << 12)
+ ((uint32_t)data->data2 << 13)
+ .....;
}
Run Code Online (Sandbox Code Playgroud)
我不确定语法是否正确,但我们的想法是将值转移而不必担心编译器或平台.这是否因为?这种方法是否存在可移植性问题?
我正在Altera软处理器上编写应用程序.API提供对VHDL中定义的寄存器的访问,如下所示.
#define __IO_CALC_ADDRESS_DYNAMIC(BASE, OFFSET) \
((void *)(((alt_u8*)BASE) + (OFFSET)))
#define IOWR_32DIRECT(BASE, OFFSET, DATA) \
__builtin_stwio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
Run Code Online (Sandbox Code Playgroud)
基于我所学到的关于编写与硬件或寄存器直接接口的代码的所有内容,我编写了这样的代码,
typedef uint8_t volatile reg; /* special type to access registers */
typedef struct reg_one /* access to base and offsets */
{
reg data_0; /* first 8 bits */
reg data_1; /* second 8 bits */
.
.
} reg_one;
static reg_one *const reg_ptr = (reg_one *)SOME_BASE_ADDRESS;
uint32_t data;
data = 0;
__builtin_stwio(&(reg_ptr->data_0), data);
Run Code Online (Sandbox Code Playgroud)
但是,地址被强制转换为void*,并且会立即丢弃volatile和const限定符.有没有解决这个问题,或者我只是遗漏了一些简单的东西?
我知道使用宏来定义指针是一个选项,
#define reg_ptr ((reg_one *)SOME_ADDRESS) …Run Code Online (Sandbox Code Playgroud) 我正在编写一个在Altera NIOS II处理器上运行的C程序.该程序必须通过特定的存储器位置连接到FPGA测试板上的VHDL模块.我的界面是通过宏提供的,它指定了基本内存地址.VHDL程序员已经从该基地址分配了32位内存,我将用二进制数据填充分成四个"元素",即[0-11 | 12-15 | 16-23 | 24-31] .
我的问题是,将这些数组"元素"作为单独的数据类型处理的最佳方法是什么.我想将整个数组声明为处理数据的结构,并使用位字段声明不同的字段,但我的理解是这将在32位数组中引入填充.