aws / aws/common-io-basic

The requirement for iot_uart_ioctl() with xUartRequest = eGetTxNoOfbytes or eGetRxNoOfbytes is not reasonable

オープン
#4 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
C
スター
16
フォーク
10
PR マージ指標
30日以内にマージされた PR はありません

説明

Hello,

We are thinking of developing our own device driver as compliant to common-io-basic interface.
Among all, we are facing an issue with iot_uart_ioctl() definition as below.

----

# Description

The requirement for iot_uart_ioctl() with xUartRequest = eGetTxNoOfbytes or eGetRxNoOfbytes is not reasonable.

# Test Steps

N/A.
This is an issue with API definitions.

# Target Revision

ddfb538 (or any version on and after 8151c98).

# Details

iot_uart.h says eGetTxNoOfbytes (eGetRxNoOfbytes) requires "If the last operation was read, this returns 0" (If the last operation was write, this returns 0"). See below.

 * @note eGetTxNoOfbytes returns the number of written bytes in last operation.

* This is supposed to be called in the caller task or application callback, right after last operation completes.
* This request expects 2 bytes buffer (uint16_t).
*
* - If the last operation was write, this returns the actual number of written bytes which might be smaller than the requested number (partial write).
* - If the last operation was read, this returns 0.
*
* @note eGetRxNoOfbytes returns the number of read bytes in last operation.
* This is supposed to be called in the caller task or application callback, right after last operation completes.
* This request expects 2 bytes buffer (uint16_t).
*
* - If the last operation was read, this returns the actual number of read bytes which might be smaller than the requested number (partial read).
* - If the last operation was write, this returns 0.

As test/test_iot_uart.c implies, we assume here **you can call iot_uart_read_async() and iot_uart_write_async() concurrently**.

In such concurrent call case, "the last operation" could change in an unexpected manner, and therefore the return value for eGetTxNoOfbytes/eGetRxNoOfbytes could be unreliable.

Imagine the events occur in the following order.

* (1) Call iot_uart_write_async()
* (2) Call iot_uart_read_async()
* (3) Async write operation is complete and the callback function is called with xOpStatus = eUartWriteCompleted
* (4) Call iot_uart_ioctl() with xUartRequest = eGetTxNoOfbytes

In (4), the guy who codes this does want to get the number of successfully written bytes in (1) and (3).

But according to iot_uart.h, this guy could get 0 in this case because "the last operation was(or could be) read".
Probably, this result is not what most people expect.

I suggest we remove "If the last operation was read, this returns 0" and "If the last operation was write, this returns 0" out of this definition.
What do you think of this idea ?

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

iot_uart.h にある eGetTxNoOfbytes と eGetRxNoOfbytes の定義から始め、次に test/test_iot_uart.c を読んで、想定されている同時非同期操作を理解します。読み取りと書き込みが重なった場合の意図された動作を判断し、その決定に対応するテストを追加して、合意した API セマンティクスを iot_uart.h に記述します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
c
領域
api, embedded-iot
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。