色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>簡單的庫Tinyframe

簡單的庫Tinyframe

2022-04-19 | zip | 0.04 MB | 次下載 | 2積分

資料介紹

授權(quán)協(xié)議 MIT License
開發(fā)語言 C/C++
軟件類型 開源軟件

軟件簡介

TinyFrame

TinyFrame is a simple library for building and parsing data frames to be sent over a serial interface (e.g. UART, telnet, socket). The code is written to build with --std=gnu99 and mostly compatible with --std=gnu89.

The library provides a high level interface for passing messages between the two peers. Multi-message sessions, response listeners, checksums, timeouts are all handled by the library.

TinyFrame is suitable for a wide range of applications, including inter-microcontroller communication, as a protocol for FTDI-based PC applications or for messaging through UDP packets.

The library lets you register listeners (callback functions) to wait for (1) any frame, (2) a particular frame Type, or (3) a specific message ID. This high-level API is general enough to implement most communication patterns.

TinyFrame is re-entrant and supports creating multiple instances with the limitation that their structure (field sizes and checksum type) is the same. There is a support for adding multi-threaded access to a shared instance using a mutex.

TinyFrame also comes with (optional) helper functions for building and parsing message payloads, those are provided in the utils/ folder.

Ports

TinyFrame has been ported to mutiple languages:

Please note most of the ports are experimental and may exhibit various bugs or missing features. Testers are welcome :)

Functional overview

The basic functionality of TinyFrame is explained here. For particlars, such as the API functions, it's recommended to read the doc comments in the header file.

Structure of a frame

Each frame consists of a header and a payload. Both parts can be protected by a checksum, ensuring a frame with a malformed header (e.g. with a corrupted length field) or a corrupted payload is rejected.

The frame header contains a frame ID and a message type. Frame ID is incremented with each new message. The highest bit of the ID field is fixed to 1 and 0 for the two peers, avoiding a conflict.

Frame ID can be re-used in a response to tie the two messages together. Values of the type field are user defined.

All fields in the frame have a configurable size. By changing a field in the config file, such as TF_LEN_BYTES (1, 2 or 4), the library seamlessly switches between uint8_t, uint16_t and uint32_t for all functions working with the field.

,-----+-----+-----+------+------------+- - - -+-------------,
| SOF | ID  | LEN | TYPE | HEAD_CKSUM | DATA  | DATA_CKSUM  |
| 0-1 | 1-4 | 1-4 | 1-4  | 0-4        | ...   | 0-4         | <- size (bytes)
'-----+-----+-----+------+------------+- - - -+-------------'

SOF ......... start of frame, usually 0x01 (optional, configurable)
ID  ......... the frame ID (MSb is the peer bit)
LEN ......... number of data bytes in the frame
TYPE ........ message type (used to run Type Listeners, pick any values you like)
HEAD_CKSUM .. header checksum

DATA ........ LEN bytes of data
DATA_CKSUM .. data checksum (left out if LEN is 0)

Message listeners

TinyFrame is based on the concept of message listeners. A listener is a callback function waiting for a particular message Type or ID to be received.

There are 3 listener types, in the order of precedence:

  • ID listeners - waiting for a response
  • Type listeners - waiting for a message of the given Type field
  • Generic listeners - fallback

ID listeners can be registered automatically when sending a message. All listeners can also be registered and removed manually.

ID listeners are used to receive the response to a request. When registerign an ID listener, it's possible to attach custom user data to it that will be made available to the listener callback. This data (void *) can be any kind of application context variable.

ID listeners can be assigned a timeout. When a listener expires, before it's removed, the callback is fired with NULL payload data in order to let the user free() any attached userdata. This happens only if the userdata is not NULL.

Listener callbacks return values of the TF_Result enum:

  • TF_CLOSE - message accepted, remove the listener
  • TF_STAY - message accepted, stay registered
  • TF_RENEW - sameas TF_STAY, but the ID listener's timeout is renewed
  • TF_NEXT - message NOT accepted, keep the listener and pass the message to the next listener capable of handling it.

Data buffers, multi-part frames

TinyFrame uses two data buffers: a small transmit buffer and a larger receive buffer. The transmit buffer is used to prepare bytes to send, either all at once, or in a circular fashion if the buffer is not large enough. The buffer must only contain the entire frame header, so e.g. 32 bytes should be sufficient for short messages.

Using the *_Multipart() sending functions, it's further possible to split the frame header and payload to multiple function calls, allowing the applciation to e.g. generate the payload on-the-fly.

In contrast to the transmit buffer, the receive buffer must be large enough to contain an entire frame. This is because the final checksum must be verified before the frame is handled.

If frames larger than the possible receive buffer size are required (e.g. in embedded systems with small RAM), it's recommended to implement a multi-message transport mechanism at a higher level and send the data in chunks.

Usage Hints

  • All TinyFrame functions, typedefs and macros start with the TF_ prefix.
  • Both peers must include the library with the same config parameters
  • See TF_Integration.example.c and TF_Config.example.c for reference how to configure and integrate the library.
  • DO NOT modify the library files, if possible. This makes it easy to upgrade.
  • Start by calling TF_Init() with TF_MASTER or TF_SLAVE as the argument. This creates a handle. Use TF_InitStatic() to avoid the use of malloc().
  • If multiple instances are used, you can tag them using the tf.userdata / tf.usertag field.
  • Implement TF_WriteImpl() - declared at the bottom of the header file as extern. This function is used by TF_Send() and others to write bytes to your UART (or other physical layer). A frame can be sent in it's entirety, or in multiple parts, depending on its size.
  • Use TF_AcceptChar(tf, byte) to give read data to TF. TF_Accept(tf, bytes, count) will accept mulitple bytes.
  • If you wish to use timeouts, periodically call TF_Tick(). The calling period determines the length of 1 tick. This is used to time-out the parser in case it gets stuck in a bad state (such as receiving a partial frame) and can also time-out ID listeners.
  • Bind Type or Generic listeners using TF_AddTypeListener() or TF_AddGenericListener().
  • Send a message using TF_Send(), TF_Query(), TF_SendSimple(), TF_QuerySimple(). Query functions take a listener callback (function pointer) that will be added as an ID listener and wait for a response.
  • Use the *_Multipart() variant of the above sending functions for payloads generated in multiple function calls. The payload is sent afterwards by calling TF_Multipart_Payload() and the frame is closed by TF_Multipart_Close().
  • If custom checksum implementation is needed, select TF_CKSUM_CUSTOM8, 16 or 32 and implement the three checksum functions.
  • To reply to a message (when your listener gets called), use TF_Respond() with the msg object you received, replacing the data pointer (and len) with a response.
  • At any time you can manually reset the message parser using TF_ResetParser(). It can also be reset automatically after a timeout configured in the config file.

Gotchas to look out for

  • If any userdata is attached to an ID listener with a timeout, when the listener times out, it will be called with NULL msg->data to let the user free the userdata. Therefore it's needed to check msg->data before proceeding to handle the message.
  • If a multi-part frame is being sent, the Tx part of the library is locked to prevent concurrent access. The frame must be fully sent and closed before attempting to send anything else.
  • If multiple threads are used, don't forget to implement the mutex callbacks to avoid concurrent access to the Tx functions. The default implementation is not entirely thread safe, as it can't rely on platform-specific resources like mutexes or atomic access. Set TF_USE_MUTEX to 1 in the config file.

Examples

You'll find various examples in the demo/ folder. Each example has it's own Makefile, read it to see what options are available.

The demos are written for Linux, some using sockets and clone() for background processing. They try to simulate real TinyFrame behavior in an embedded system with asynchronous Rx and Tx. If you can't run the demos, the source files are still good as examples.

?

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關(guān)電源設(shè)計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設(shè)計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 亚洲区视频| 97免费视频观看| gratis videos欧美最新| 观赏女性排尿| 久久国产伦子伦精品| 欧亚一卡二卡日本一卡二卡 | 噜妇插内射精品| 色WWW永久免费视频首页| 伊人影院综合网| 国产成人精品免费视频大全办公室| 精品日韩二区三区精品视频| 青春禁区动漫免费观看| 亚洲欧洲日产国产 最新| 操中国老太太| 久久久97丨国产人妻熟女| 色欲午夜无码久久久久久| 做暖免费观看日本| 国产人妻麻豆蜜桃色| 欧美人成在线观看ccc36| 野花日本完整版在线观看免费高清| WWW国产无套内射久久| 精选国产AV精选一区二区三区 | 一边喂奶一边做边爱| 成人伦理影院| 噜噜噜狠狠夜夜躁| 亚洲精品天堂自在久久77| 攻把受做哭边走边肉楼梯PLAY | 手机在线观看你懂的| 1788vv视频| 海角社区在线视频播放观看| 日本A级作爱片金瓶双艳| 亚洲一级毛片免费在线观看| 国产成人啪精视频精东传媒网站| 免费一区在线观看| 一个人免费观看在线视频播放 | 成人在线视频国产| 久久午夜夜伦鲁鲁片无码免费| 午夜欧洲亚洲AV永久无码精品| TUBE19UP老师学生| 理论片午午伦夜理片影院| 亚洲一区二区女搞男|