日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

管道:实用程序服务和数据结构

發布時間:2023/11/28 生活经验 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 管道:实用程序服务和数据结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

管道:實用程序服務和數據結構

Pipes: utility services and data structures

管道公用設施

Nucleus RTOS有四個API調用,它們提供與管道相關的實用程序函數:重置管道、返回有關管道的信息、返回應用程序中管道的數量以及返回指向應用程序中所有管道的指針。前三個在Nucleus SE中實現。

重置管道

此API調用將管道恢復到其未使用的初始狀態。管道中存儲的所有消息都將丟失。在管道上暫停的任何任務都將恢復,并收到NUSE_pipe_WAS_RESET的返回代碼。

Nucleus RTOS API Call for Resetting a Pipe

Service call prototype:

STATUS NU_Reset_Pipe(NU_PIPE *pipe;

Parameters:

pipe – pointer to user-defined pipe control block

Returns:

NU_SUCCESS – the call was completed successfully

NU_INVALID_PIPE – the pipe pointer is not valid

Nucleus SE API Call for Resetting a Pipe

This API call supports the key functionality of the Nucleus RTOS API.

Service call prototype:

STATUS NUSE_Pipe_Reset(NUSE_PIPE pipe);

Parameters:

pipe – the index (ID) of the pipe to be reset

Returns:

NUSE_SUCCESS – the call was completed successfully

NUSE_INVALID_PIPE – the pipe index is not valid

管道復位的Nucleus-SE實現

NUSE_Pipe_Reset()API函數的初始部分(在參數檢查之后)非常簡單。頭和尾索引以及管道的消息計數都設置為零。

啟用阻塞時,其他代碼負責喚醒任何掛起的任務,因此:

while (NUSE_Pipe_Blocking_Count[pipe] != 0){ U8 index; /* check whether any tasks are blocked / / on this pipe */ for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_PIPE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == pipe)) { NUSE_Task_Blocking_Return[index] = NUSE_PIPE_RESET; NUSE_Task_Status[index] = NUSE_READY; break; } } NUSE_Pipe_Blocking_Count[pipe]–;}#if NUSE_SCHEDULER_TYPE == NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK);#endif

管道上掛起的每個任務都標記為“就緒”,掛起返回代碼NUSE_pipe_WAS_RESET。此過程完成后,如果正在使用優先級調度程序,則會調用NUSE_Reschedule(),因為一個或多個優先級較高的任務可能已準備就緒,需要允許其運行。

管道信息

此服務調用獲取有關管道的信息選擇。Nucleus SE實現與Nucleus RTOS的不同之處在于,它返回的信息較少,因為不支持對象命名、可變消息大小和掛起順序,并且可能無法啟用任務掛起。

Nucleus RTOS API調用管道信息

Service call prototype:

STATUS NU_Pipe_Information(NU_PIPE *pipe, CHAR *name,

VOID **start_address,UNSIGNED *pipe_size, UNSIGNED *available,

UNSIGNED *messages, OPTION *message_type, UNSIGNED *message_size,

OPTION *suspend_type, UNSIGNED *tasks_waiting,
NU_TASK **first_task);

Parameters:

pipe – pointer to the user-supplied pipe control block

name – pointer to an 8-character
destination area for the message-pipe’s name

start_address – a pointer to a pointer, which will receive the address of the start of the pipe’s data area

pipe_size – a pointer to a variable for holding the total number of bytes in the pipe

available – a pointer to a variable for holding the number of available bytes in the pipe

messages – a pointer to a variable for holding the number of messages currently in the pipe

message_type – pointer to a variable for holding the type of messages supported by the pipe; valid message types are NU_FIXED_SIZE and NU_ VARIABLE_SIZE

message_size – pointer to a variable for holding the number of bytes in each pipe message; if the pipe supports variable-length messages, this number is the maximum message size

suspend_type – pointer to a variable for holding the task suspend type. Valid task suspend types are NU_FIFO and NU_PRIORITY

tasks_waiting – a pointer to a variable which will receive the number of tasks suspended on this pipe

first_task – a pointer to a task pointer; the pointer of the first suspended task is placed in this task pointer

Returns:

NU_SUCCESS – the call was completed successfully

NU_INVALID_PIPE – the pipe pointer is not valid

Nucleus SE API Call for Pipe Information

This API call supports the key functionality of the Nucleus RTOS API.

Service call prototype:

STATUS NUSE_Pipe_Information(NUSE_PIPE pipe,

ADDR *start_address, U8 *pipe_size, U8 *available, U8、 *messages,

U8 *message_size, U8 *tasks_waiting, NUSE_TASK *first_task);

Parameters:

pipe – the index of the pipe about which information is being requested

start_address – a pointer to a variable of type ADDR , which will receive the address of the start of the pipe’s data area

pipe_size – a pointer to a variable of type U8 , which will receive the total number of messages for which the pipe has capacity

available – a pointer to a variable of type U8 , which will receive the number of messages for which the pipe has currently remaining capacity

messages – a pointer to a variable of type U8 , which will receive the number of messages currently in the pipe

message size – a pointer to a variable of type U8 , which will receive the size of messages handled by this pipe

tasks_waiting – a pointer to a variable which will receive the number of tasks suspended on this pipe (nothing returned if task suspend is disabled)

first_task – a pointer to a variable of type NUSE_TASK which will receive the index of the first suspended task (nothing returned if task suspend is disabled)

Returns:

NUSE_SUCCESS – the call was completed successfully

NUSE_INVALID_PIPE – the pipe index is not valid

NUSE_INVALID_POINTER – one or more of the pointer parameters is invalid

Nucleus SE Implementation of Pipe Information

The implementation of this API call is quite straightforward:

*start_address = NUSE_Pipe_Data[pipe];*pipe_size = NUSE_Pipe_Size[pipe];*available = NUSE_Pipe_Size[pipe] - NUSE_Pipe_Items[pipe];*messages = NUSE_Pipe_Items[pipe];*message_size = NUSE_Pipe_Message_Size[pipe];#if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Pipe_Blocking_Count[pipe]; if (NUSE_Pipe_Blocking_Count[pipe] != 0) { U8 index; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_PIPE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == pipe)) { *first_task = index; break; } } } else { *first_task = 0; }#else *tasks_waiting = 0; *first_task = 0;#endif

函數返回管道狀態。然后,如果啟用了阻塞API調用,則返回等待的任務數和第一個任務的索引(否則這兩個參數設置為0)。

獲取管道數量

此服務調用返回應用程序中配置的管道數。而在Nucleus RTOS中,這將隨時間而變化,返回的值將表示當前的管道數,而在Nucleus SE中,返回的值是在構建時設置的,不能更改。

Nucleus RTOS API Call for Pipe Count

Service call prototype:

UNSIGNED NU_Established_Pipes(VOID);

Parameters:

None

Returns:

The number of created pipes in the system.

Nucleus SE API Call for Pipe Count

This API call supports the key functionality of the Nucleus RTOS API.

Service call prototype:

U8 NUSE_Pipe_Count(void);

Parameters:

None

Returns:

The number of configured pipes in the application

Nucleus SE Implementation of Pipe Count

管道計數的Nucleus SE實現

這個API調用的實現非常簡單:返回#define符號NUSE_PIPE_編號的值。

數據結構

管道使用六個或七個數據結構—全部在RAM和ROM中—與其他Nucleus SE對象一樣,這些數據結構是一系列表,根據配置的管道數量和選擇的選項進行包含和標注。

我強烈建議應用程序代碼不要直接訪問這些數據結構,而是使用提供的API函數。這避免了與Nucleus SE未來版本的不兼容和不必要的副作用,并簡化了將應用程序移植到Nucleus RTOS的過程。這里包含數據結構的詳細信息,以便更容易地理解服務調用代碼的工作方式和調試。

Kernel RAM Data

These data structures are:

NUSE_Pipe_Head[] – This is an array of type U8 , with one entry for each configured pipe, which represents a pointer to the front of the pipe of messages. It is used as an index off of the addresses in NUSE_Pipe_Data[] (see below).

NUSE_Pipe_Tail[] – This is an array of type U8 , with one entry for each configured pipe, which represents a pointer to the end of the pipe of messages. It is used as an index off of the addresses in NUSE_Pipe_Data[] (see below).

NUSE_Pipe_Items[] – This is an array of type U8 , with one entry for each configured pipe, which represents a count of the current number of messages in the pipe. This data is arguably redundant, as its value can be derived from the head and tail indexes, but storing the count simplifies the code.

NUSE_Pipe_Blocking_Count[] – This type U8 array contains the counts of
how many tasks are blocked on each pipe. This array only exists if blocking API call support is enabled.

當Nucleus SE啟動時,這些數據結構都由NUSE_Init_Pipe()初始化為零。這是合乎邏輯的,因為它將每個管道渲染為空(未使用)。未來的文章將全面描述Nucleus SE的啟動過程。
以下是nuse_init.c文件中這些數據結構的定義:

RAM U8 NUSE_Pipe_Head[NUSE_PIPE_NUMBER];RAM U8 NUSE_Pipe_Tail[NUSE_PIPE_NUMBER];RAM U8 NUSE_Pipe_Items[NUSE_PIPE_NUMBER];#if NUSE_BLOCKING_ENABLE RAM U8 NUSE_Pipe_Blocking_Count[NUSE_PIPE_NUMBER];#endif

用戶RAM

用戶應負責為每個配置的管道提供一個RAM區域用于數據存儲。這個RAM區域的大小必須容納一個U8類型的數組,該數組的大小足以容納管道中的所有消息。

ROM Data

These data structures are:

NUSE_Pipe_Data[] – This is an array of type ADDR , with one entry for each configured pipe, which represents a pointer to the data area (discussed in User RAM above) for each pipe.

NUSE_Pipe_Size[] – This is an array of type U8 , with one entry for each configured pipe, which represents the number of messages that may be accommodated by each pipe.

NUSE_Pipe_Message_Size [] – This is an array of type U8 , with one entry for each configured pipe, which represents the size of messages (in bytes) that may be accommodated by each pipe.

These data structures are all declared and initialized (statically, of course) in nuse_config.c , thus:

ROM ADDR NUSE_Pipe_Data[NUSE_PIPE_NUMBER] ={ / addresses of pipe data areas ------ /};ROM U8 NUSE_Pipe_Size[NUSE_PIPE_NUMBER] ={ / pipe sizes ------ /};ROM U8 NUSE_Pipe_Message_Size[NUSE_PIPE_NUMBER] ={ / pipe message sizes ------ */};

管道數據示意圖

與Nucleus SE中的所有內核對象一樣,管道所需的數據內存量也很容易預測。

應用程序中所有管道的ROM數據占用(字節)可以這樣計算:

NUSE_PIPE_NUMBER * (sizeof(ADDR) + 2)

啟用阻塞API調用時,應用程序中所有管道的內核RAM數據占用(字節)可以這樣計算:

NUSE_PIPE_NUMBER *4

Otherwise it is:

NUSE_PIPE_NUMBER * 3

The amount of user RAM (in bytes) required for the pipe with index pipe is:

NUSE_Pipe_Size[pipe] * NUSE_Pipe_Message_Size[pipe]

Unimplemented API Calls

Four pipe API calls found in Nucleus RTOS are not implemented in
Nucleus SE:

Create Pipe

This API call creates a pipe. It is not needed with Nucleus SE, as pipes are created statically.

Service call prototype:

STATUS NU_Create_Pipe(NU_PIPE *pipe, char *name,

VOID *start_address, UNSIGNED pipe_size, OPTION message_type,

UNSIGNED message_size, OPTION suspend_type);

Parameters:

pipe – pointer to a user-supplied pipe control block; this will be used as a “handle” for the pipe in other API calls

name – pointers to a 7-character, null-terminated name for the pipe

start_address – starting address for the pipe

pipe_size – the total number of bytes in the pipe

message_type – type of message supported by the pipe; may be NU_FIXED_SIZE or NU_VARIABLE_SIZE

message_size – if the pipe supports fixed size messages, this parameter specifies the exact size of each message; otherwise, if the pipe supports variable sized messages, this is the maximum message size

suspend_type – specifies how tasks suspend on the pipe. Valid options for this parameter are NU_FIFOand NU_PRIORITY , which represent
First-In-First-Out (FIFO) and priority-order task suspension, respectively

Returns:

NU_SUCCESS – indicates successful completion of the service

NU_INVALID_PIPE – indicates the pipe control block pointer is NULL or
already in use

NU_INVALID_MEMORY – indicates the memory area specified by the start_address is invalid

NU_INVALID_MESSAGE – indicates that the message_type parameter
is invalid

NU_INVALID_SIZE – indicates that either the message size is greater than the pipe size, or that the pipe size or message size is zero

NU_INVALID_SUSPEND – indicates that the suspend_type parameter
is invalid

Delete Pipe

This API call deletes a previously created pipe. It is not needed with Nucleus SE, as pipes are created statically and cannot be deleted.

Service call prototype:

STATUS NU_Delete_Pipe(NU_PIPE *pipe);

Parameters:

pipe – pointer to pipe control block

Returns:

NU_SUCCESS – indicates successful completion of the service

NU_INVALID_PIPE – indicates the pipe pointer is invalid

Pipe Pointers

This API call builds a sequential list of pointers to all pipes in the system. It is not needed with Nucleus SE, as pipes are identified by a simple index, not a pointer, and it would be redundant.

Service call prototype:

UNSIGNED NU_Pipe_Pointers(NU_PIPE **pointer_list,
UNSIGNED maximum_pointers);

Parameters:

pointer_list – pointer to an array of NU_PIPE pointers; this array will be filled with pointers to established pipes in the system

maximum_pointers – the maximum number of pointers to place in the array

Returns:

The number of NU_PIPE pointers placed into the array

Broadcast to Pipe

This API call broadcasts a message to all tasks waiting for a message from the specified pipe. It is not implemented with Nucleus SE, as it would have added excessive complexity.

Service call prototype:

STATUS NU_Broadcast_To_Pipe(NU_PIPE *pipe, VOID *message,

UNSIGNED size, UNSIGNED suspend);

Parameters:

pipe – pointer to pipe control block

message – pointer to the broadcast message

size – the number of UNSIGNED data elements in the message. If the pipe supports variable-length messages, this parameter must be equal to or less than the message size supported by the pipe. If the pipe supports fixed-size messages, this parameter must be exactly the same as the
message size supported by the pipe

suspend – specifies whether or not to suspend the calling task if the pipe is already full; valid options for this parameter are NU_NO_SUSPEND , NU_SUSPEND or a timeout value.

Returns:

NU_SUCCESS – indicates successful completion of the service

NU_INVALID_PIPE – indicates the pipe pointer is invalid

NU_INVALID_POINTER – indicates that the message pointer is NULL

NU_INVALID_SIZE – Indicates that the message size specified is not compatible with the size specified when the pipe was created

NU_INVALID_SUSPEND – indicates that suspend attempted from a non-task thread

NU_PIPE_FULL – indicates that there is insufficient space in the pipe for the message

NU_TIMEOUT – indicates the pipe is still full after the timeout has expired

NU_PIPE_DELETED – pipe was deleted while task was suspended

NU_PIPE_RESET – pipe was reset while the task was suspended

Compatibility with Nucleus RTOS

With all aspects of Nucleus SE, it was my goal to maintain as high a level of applications code compatibility with Nucleus RTOS as possible.
Pipes are no exception, and, from a user’s perspective, they are implemented in much the same way as in Nucleus RTOS. There are areas of incompatibility, which have come about where I determined that such an incompatibility would be acceptable, given that the resulting code is easier to understand, or, more likely, could be made more memory efficient. Otherwise, Nucleus RTOS API calls may be almost directly mapped onto Nucleus SE calls. A future article will include further information on using Nucleus SE for users of Nucleus RTOS.

Object Identifiers

In Nucleus RTOS, all objects are described by a data structure –
a control block – which has a specific data type. A pointer to this control
block serves as an identifier for the pipe. In Nucleus SE, I decided that a
different approach was needed for memory efficiency, and all kernel objects are described by a number of tables in RAM and/or ROM. The size of these tables is determined by the number of each object type that is configured. The identifier for a specific object is simply an index into those tables. So, I have defined NUSE_PIPE as being equivalent to U8 ; a variable – not a pointer – of this type then serves as the pipe identifier. This is a small incompatibility, which is easily handled if code is ported to or from Nucleus RTOS. Object identifiers are normally just stored and passed around and not operated upon in any way.

Nucleus RTOS also supports naming of pipes. These names are only
used for target-based debug facilities. I omitted them from Nucleus SE to save memory.

Message Size and Variability

In Nucleus RTOS, a pipe may be configured to handle messages
which are comprised of an arbitrary number of bytes of data. Likewise, in
Nucleus SE. Nucleus RTOS also supports pipes with variable size messages, where only the maximum size is specified at creation time. Variable size messages are not supported by Nucleus SE.

Pipe Size

The number of messages in a pipe in Nucleus SE is limited to 256, as all the index variables and constants are type U8 . Nucleus RTOS is not limited in this way.

Unimplemented API Calls

Nucleus RTOS supports ten service calls to work with pipes. Of these, four are not implemented in Nucleus SE. Details of these and of the decision to omit them may be found in Unimplemented API Calls earlier in this article.

The next RTOS Revealed article will look at system time.

總結

以上是生活随笔為你收集整理的管道:实用程序服务和数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。