硬體條件:飛思卡爾的二型集中器(基於coretex-m4的飛思卡爾k60方案) 其中網絡卡晶元是ar8032
軟體條件: iar開發平台 mqx 系統
首先,建立乙個自啟動任務 mqx_auto_start_task
const task_template_struct mqx_template_list =
, ,,};
這裡要注意分配的棧空間。其中,第四 個引數為 優先順序。越大優先順序越低,10比9的優先順序小。分配 net_recv_task 和net_send_task為10,讓他們並行。
void main_task( uint_32 temp)
net_send_task_id=_task_create( 0, 10, 0); //建立send_task
if (net_send_task_id == mqx_null_task_id)
}
眾所周知,每個任務體都有個死迴圈。要想讓其他任務執行。最好在這個迴圈中有乙個阻塞函式。或者用乙個延時_time_delay(400); 這個當中的400 ms為經驗值。
void net_send_task(uint_32 temp)
;send_length=send(sockclient,buf,sizeof(buf),0);
printf("andy: file %s function %s line %d send_length is %d j is %d\n",__file__,__function__,__line__,send_length,j);
}
printf("\nthe sizeof queue is %d \n",_charq_size(queue1));
while( (send_length>0)&(!_charq_empty(queue1)))}}
這裡向服務端傳送乙個約定好的心跳包。
/*
fuction: net_recv_task
comments: 通過乙太網接受資料
*/ void net_recv_task(uint_32 temp)
; int recv_length;
int send_length;
uchar buff4;
time_struct time;
uint_32 end_time;
uint_32 start_time;
_time_get(&time);
end_time=time.seconds*1000 + time.milliseconds;
start_time=end_time;
while(1)
//一分鐘接收不到任何資料,讓send_task 傳送乙個心跳包
_time_get(&time);
end_time=time.seconds*1000 + time.milliseconds;
printf(" end_time is %d, start_time is %d\n",end_time,start_time);
if(1==recv_length)
else
}_time_delay(400); //讓出時間片}}
1.佇列的操作
佇列是mqx 任務之間輕量級的傳遞資料的工具。文件《freescale mqx 實時作業系統使用者手冊》中對列的描述如下:
這個佇列在作業系統中,應用很廣泛。個人感覺這queue_struct 主要用裝置驅動方面(mqx\source\kernel\queue.c)。把表示裝置的結構體鏈結到核心裡面。不太適合,乙個字元進入,乙個字元出來的情況。這裡主要使用 charq_struct (mqx\source\include\charq.h)。 值得注意是這個佇列的初始化,並不是在這個標頭檔案中 _charq_init(cq,max_size) 。在申請佇列大小時需要為它分配空間。
queue1 = (charq_struct_ptr)_mem_alloc_system((_mem_size)( sizeof(charq_struct) - (4 * sizeof(char)) + queue_size_1));
charq_struct 結構體定義如下:
typedef struct charq_struct
charq_struct, _ptr_ charq_struct_ptr;
申請的結構的在記憶體中的分布如下:
2.mqx中的網路操作
rtcs_create() 通訊元件起來之後,enet_initialize(.....) 初始化網路之後,在於本機(集中器)的ip繫結。然後常規的tcp客戶端操作即可以聯上。
在enet_initialize(...)之後,我們會得到乙個控制代碼(ehandle) ,通過( enet_link_status(ehandle))可以得到這個時候機器的網線插拔狀態。
c 下 socket 客戶端 程式設計
using system.io using system.net.sockets using system.net private void button4 click object sender,eventargs e s new socket addressfamily.internetwork...
c 下 socket 客戶端 程式設計
using system.io using system.net.sockets using system.net private void button4 click object sender,eventargs e s new socket addressfamily.internetwork...
linux 下socket 伺服器和客戶端非同步通訊
我們知道用socket進行通訊時,傳送資料和接收資料所使用的recv send函式會阻塞程序,只有收到或傳送資料後才能返回值,導致是socket通訊只能實現伺服器和客戶端交替收發資料,而使用select可以很好地解決這個問題。諸如connect accept recv或recvfrom這樣的阻塞程式...