一、为何发现
今天玩了一下W801(其实是不是800换马甲…我还留着2片菊花板)
发现了一个队列的传参是void **
receive,参数是 (void **)&msg
tls_os_queue_receive(sock_c->sock_c_q, (void **)&msg, 0, 0);
//printf("\n msg =%d\n",msg);
switch((u32)msg)
{
case DEMO_MSG_WJOIN_SUCCESS:
break;
case DEMO_MSG_SOCKET_CREATE:
socket_client_demo();
break;
case DEMO_MSG_WJOIN_FAILD:
if(sock_c->socket_num > 0)
{
sock_c->socket_num = 0;
sock_c->socket_ok = FALSE;
}
break;
case DEMO_MSG_SOCKET_RECEIVE_DATA:
break;
case DEMO_MSG_UART_RECEIVE_DATA:
while(sock_c->uart_trans)
{
tls_os_queue_receive(demo_sockc_q, (void **) &uart_msg, 0, 0);
if((u32)uart_msg != DEMO_SOCK_MSG_UART_RX)
{
continue;
}
readlen = (demo_sockc_uart.rxlen > DEMO_SOCK_BUF_SIZE) ?
DEMO_SOCK_BUF_SIZE : demo_sockc_uart.rxlen;
demo_sockc_uart.rxbuf = tls_mem_alloc(readlen);
if(demo_sockc_uart.rxbuf == NULL)
{
printf("demo_socks_uart->rxbuf malloc err\n");
continue;
}
ret = tls_uart_read(TLS_UART_1, demo_sockc_uart.rxbuf, readlen);
if(ret < 0)
{
tls_mem_free(demo_sockc_uart.rxbuf);
continue;
}
demo_sockc_uart.rxlen -= ret;
readlen = ret;
offset = 0;
do
{
ret = send(sock_c->socket_num, demo_sockc_uart.rxbuf + offset, readlen, 0);
offset += ret;
readlen -= ret;
}
while(readlen);
tls_mem_free(demo_sockc_uart.rxbuf);
}
if (-1 == sock_c->snd_data_len)
{
len = DEMO_SOCK_BUF_SIZE;
}
else if(sock_c->snd_data_len != 0)
{
len = (sock_c->snd_data_len > DEMO_SOCK_BUF_SIZE) ?
DEMO_SOCK_BUF_SIZE : sock_c->snd_data_len;
}
else
{
break;
}
memset(sock_c->sock_tx, 0x35, len);
ret = send(sock_c->socket_num, sock_c->sock_tx, len, 0);
if (ret != -1)
{
if (sock_c->snd_data_len != -1)
{
sock_c->snd_data_len -= ret;
}
}
if (sock_c->socket_ok && sock_c->snd_data_len != 0)
{
tls_os_time_delay(1);
tls_os_queue_send(sock_c->sock_c_q, (void *)DEMO_MSG_UART_RECEIVE_DATA, 0);
}
break;
case DEMO_MSG_SOCKET_ERR:
tls_os_time_delay(200);
printf("\nsocket err\n");
create_client_socket_demo( );
break;
default:
break;
}
send,参数是(void *)
tls_os_queue_send(demo_sock_c->sock_c_q, (void *)DEMO_MSG_UART_RECEIVE_DATA, 0);
而这个数据是
#define DEMO_MSG_UART_RECEIVE_DATA 4
这里没毛病的,判断的是 DEMO_MSG_UART_RECEIVE_DATA
这个数据(这个数据就是一个地址类型),而不是 DEMO_MSG_UART_RECEIVE_DATA
这个数据指向的数值( 内存是 4 这个地址的数值)
其实地址也是一个数值而已…
参考一下文章:https://blog.csdn.net/unix21/article/details/8923752
二、个人理解
要通过函数改变一个数据,那形参必须是这个数据的地址。传入地址的地址的好处,例如我需要传递不同数据类型的数据到函数里面,就可以通过这种方法来实现(就类似上述队列的数据)
版权声明:本文为xuan530482366原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。