MQX下佇列和socket 客戶端的 的程式設計

2021-06-23 00:17:46 字數 2689 閱讀 4149

硬體條件:飛思卡爾的二型集中器(基於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這樣的阻塞程式...