From 00f1db0592b650d1504d79aa2812a8f1eb417385 Mon Sep 17 00:00:00 2001 From: chopupu <1123478123@qq.com> Date: Wed, 11 Jun 2025 14:52:47 +0800 Subject: [PATCH 1/3] docs:add user manual from openEuler docs --- README.md | 4 +- docs/en/_toc.yaml | 10 ++ {doc/user_guide => docs/en}/figures/FCS.png | Bin .../en}/figures/MemoryApplication.png | Bin .../en}/figures/MemoryRelease.png | Bin .../en}/figures/pend_semaphore.png | Bin .../en}/figures/post_semaphore.png | Bin docs/en/overview.md | 11 ++ docs/en/uniproton_apis.md | 3 + docs/en/uniproton_functions.md | 151 ++++++++++++++++++ {doc/user_guide => docs/zh}/_toc.yaml | 0 docs/zh/figures/FCS.png | Bin 0 -> 22115 bytes docs/zh/figures/MemoryApplication.png | Bin 0 -> 6386 bytes docs/zh/figures/MemoryRelease.png | Bin 0 -> 10618 bytes docs/zh/figures/pend_semaphore.png | Bin 0 -> 32691 bytes docs/zh/figures/post_semaphore.png | Bin 0 -> 26707 bytes {doc/user_guide => docs/zh}/overview.md | 0 {doc/user_guide => docs/zh}/uniproton-apis.md | 0 .../zh}/uniproton-functions.md | 0 19 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 docs/en/_toc.yaml rename {doc/user_guide => docs/en}/figures/FCS.png (100%) rename {doc/user_guide => docs/en}/figures/MemoryApplication.png (100%) rename {doc/user_guide => docs/en}/figures/MemoryRelease.png (100%) rename {doc/user_guide => docs/en}/figures/pend_semaphore.png (100%) rename {doc/user_guide => docs/en}/figures/post_semaphore.png (100%) create mode 100644 docs/en/overview.md create mode 100644 docs/en/uniproton_apis.md create mode 100644 docs/en/uniproton_functions.md rename {doc/user_guide => docs/zh}/_toc.yaml (100%) create mode 100644 docs/zh/figures/FCS.png create mode 100644 docs/zh/figures/MemoryApplication.png create mode 100644 docs/zh/figures/MemoryRelease.png create mode 100644 docs/zh/figures/pend_semaphore.png create mode 100644 docs/zh/figures/post_semaphore.png rename {doc/user_guide => docs/zh}/overview.md (100%) rename {doc/user_guide => docs/zh}/uniproton-apis.md (100%) rename {doc/user_guide => docs/zh}/uniproton-functions.md (100%) diff --git a/README.md b/README.md index 44aecf6e..7bcfd4e0 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,9 @@ git clone https://gitee.com/openeuler/UniProton.git ### 5、相关文档 -[UniProton用户指南](https://docs.openeuler.org/zh/docs/23.09/docs/Embedded/UniProton/UniProton%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97-%E6%A6%82%E8%BF%B0.html) +[UniProton用户指南](./docs/zh/overview.md) -[UniProton接口说明文档](https://docs.openeuler.org/zh/docs/23.09/docs/Embedded/UniProton/UniProton%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E.html) +[UniProton接口说明文档](./docs/zh/uniproton-apis.md) [yocto构建系统介绍](https://pages.openeuler.openatom.cn/embedded/docs/build/html/master/yocto/index.html) diff --git a/docs/en/_toc.yaml b/docs/en/_toc.yaml new file mode 100644 index 00000000..02572774 --- /dev/null +++ b/docs/en/_toc.yaml @@ -0,0 +1,10 @@ +label: UniProton User Guide +isManual: true +description: UniProton is an OS tailored for embedded environments. It offers task and memory management, interrupt handling, and advanced debugging features. +sections: + - label: Overview + href: ./overview.md + - label: UniProton Feature Design + href: ./uniproton_functions.md + - label: UniProton Interfaces + href: ./uniproton_apis.md diff --git a/doc/user_guide/figures/FCS.png b/docs/en/figures/FCS.png similarity index 100% rename from doc/user_guide/figures/FCS.png rename to docs/en/figures/FCS.png diff --git a/doc/user_guide/figures/MemoryApplication.png b/docs/en/figures/MemoryApplication.png similarity index 100% rename from doc/user_guide/figures/MemoryApplication.png rename to docs/en/figures/MemoryApplication.png diff --git a/doc/user_guide/figures/MemoryRelease.png b/docs/en/figures/MemoryRelease.png similarity index 100% rename from doc/user_guide/figures/MemoryRelease.png rename to docs/en/figures/MemoryRelease.png diff --git a/doc/user_guide/figures/pend_semaphore.png b/docs/en/figures/pend_semaphore.png similarity index 100% rename from doc/user_guide/figures/pend_semaphore.png rename to docs/en/figures/pend_semaphore.png diff --git a/doc/user_guide/figures/post_semaphore.png b/docs/en/figures/post_semaphore.png similarity index 100% rename from doc/user_guide/figures/post_semaphore.png rename to docs/en/figures/post_semaphore.png diff --git a/docs/en/overview.md b/docs/en/overview.md new file mode 100644 index 00000000..f3207a85 --- /dev/null +++ b/docs/en/overview.md @@ -0,0 +1,11 @@ +# UniProton User Guide + +## Introduction + +UniProton is an operating system (OS) for embedded scenarios provided by the openEuler community. It aims to build a high-quality OS platform that shields underlying hardware differences for upper-layer service software and provides powerful debugging functions. UniProton allows service software to be quickly ported to different hardware platforms, facilitates chip selection, and reduces costs for hardware procurement and software maintenance. + +This document describes the basic functions and APIs of UniProton. + +## Compilation + +For details about compilation, see . diff --git a/docs/en/uniproton_apis.md b/docs/en/uniproton_apis.md new file mode 100644 index 00000000..87ed2109 --- /dev/null +++ b/docs/en/uniproton_apis.md @@ -0,0 +1,3 @@ +# UniProton APIs + +This document is currently not available in English. diff --git a/docs/en/uniproton_functions.md b/docs/en/uniproton_functions.md new file mode 100644 index 00000000..730c0ad0 --- /dev/null +++ b/docs/en/uniproton_functions.md @@ -0,0 +1,151 @@ +# UniProton Feature Design + +## Task Management + +UniProton is a single-process multi-thread operating system (OS). In UniProton, a task represents a thread. Tasks in UniProton are scheduled in preemption mode instead of time slice rotation scheduling. High-priority tasks can interrupt low-priority tasks. Low-priority tasks can be scheduled only after high-priority tasks are suspended or blocked. + +A total of 32 priorities are defined, with priority 0 being the highest and 31 being the lowest. Multiple tasks can be created in a priority. + +The task management module of UniProton provides the following functions: Creates, deletes, suspends, resumes, and delays tasks; Locks and unlocks task scheduling; Obtains the current task ID; Obtains and sets task private data; Query the pending semaphore ID of a specified task; Query the status, context, and general information of a specified task; Obtains and sets task priorities; Adjusts the task scheduling order of a specified priority; Register and unregister hooks for task creation, deletion, and switching. During initialization, UniProton creates an idle task with the lowest priority by default. When no task is in the running status, the idle task is executed. + +## Event Management + +The event mechanism enables communication between threads. Event communication can only be event notifications and no data is transmitted. + +As an extension of tasks, events allow tasks to communicate with each other. Each task supports 32 event types, each represented by a bit of a 32-bit value. + +UniProton can read current task events and write specified task events. Multiple event types can be read or written at one time. + +## Queue Management + +A queue, also called message queue, is a method commonly used for inter-thread communication to store and transfer data. Data can be written to the head or tail of a queue based on the priority, but can be read only from the head of a queue. + +When creating a queue, UniProton allocates memory space for the queue based on the queue length and message unit size input by the user. The queue control block contains **Head** and **Tail** pointers, which indicate the storage status of data in a queue. **Head** indicates the start position of occupied message nodes in the queue. **Tail** indicates the end position of the occupied message nodes in the queue. + +## Hard Interrupt Management + +A hardware interrupt is a level signal that is triggered by hardware and affects system running. A hardware interrupt is used to notify the CPU of a hardware event. Hardware interrupts include maskable interrupts and non-maskable interrupts (NMIs). + +Hardware interrupts have different internal priorities, but they all have a higher priority than other tasks. When multiple hardware interrupts are triggered at the same time, the hardware interrupt with the highest priority is always responded first. Whether a high-priority hardware interrupt can interrupt a low-priority hardware interrupt that is being executed (that is, nested interrupts) depends on the chip platform. + +The OS creates a tick hardware interrupt during initialization for task delay and software timer purposes. The tick is essentially a hardware timer. + +## Memory Management + +Memory management is to dynamically divide and manage large memory areas allocated by users. When a section of a program needs to use the memory, the program calls the memory application function of the OS to obtain the memory block of a specified size. After using the memory, the program calls the memory release function to release the occupied memory. + +UniProton provides the FSC memory algorithm. The following table lists the advantages, disadvantages, and application scenarios of FSC. + +| Algorithm | Advantages | Disadvantages | Application Scenarios | +| :----------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------ | ------------------------------------ | +| Private FSC algorithm| The memory control block information occupies a small amount of memory. The minimum 4-byte-aligned memory block size can be applied for. Adjacent memory blocks can be quickly split and merged without creating memory fragmentation.| The efficiency of memory application and release is low.| It can flexibly adapt to various product scenarios.| + +The FSC memory algorithm is described as follows: + +### FSC Memory Algorithm + +#### Core Idea + +The size of the requested memory is **uwSize**. If the size is in binary, it is expressed as **0b{0}1xxx**. **{0}** indicates that there may be one or more zeros before **1**. Regardless of the content of following **1** (**xxx**), if **1** is changed to **10** and **xxx** is changed to **0**, **10yyy** is always greater than **1xxx** (**yyy** indicates that the corresponding bits of **xxx** are changed to **0**). + +The subscript of the leftmost 1 can be directly obtained. The subscript values are 0 to 31 from the most significant bit to the least significant bit (BitMap), or 0 to 31 from the least significant bit to the most significant bit (uwSize). If the subscripts of the bits of the 32-bit register are 0 to 31 from the most significant bit to the least significant bit, the subscript of the leftmost 1 of 0x80004000 is 0. Therefore, we can maintain an idle linked list header array (the number of elements does not exceed 31). The subscript of the leftmost 1 of the memory block size is used as the index of the linked list header array. That is, all memory blocks with the same subscript of the leftmost 1 are mounted to the same idle linked list. + +For example, the sizes of idle blocks that can be mounted to the linked list whose index is 2 are 4, 5, 6, and 7, and the sizes of idle blocks that can be mounted to the linked list whose index is N are 2^N to 2^(N+1)-1. + +![](./figures/FCS.png) + +#### Memory Application + +When applying for the memory of uwSize, use assembly instructions to obtain the subscript of the leftmost 1 first. Assume that the subscript is **n**. To ensure that the first idle memory block in the idle linked list meets the uwSize requirement, the search starts from the index n+1. If the idle linked list of index n+1 is not empty, the first idle block in the linked list is used. If the linked list of n+1 is empty, the linked list of n+2 is checked, and so on, until a non-empty linked list is found or the index reaches 31. + +A 32-bit BitMap global variable is defined to prevent the for loop from checking whether the idle linked list is empty recursively. If the idle linked list of n is not empty, the value whose subscript is n of BitMap is set to 1. Otherwise, the value is set to 0. The bit whose subscript is 31 of the BitMap is directly set to 1 during initialization. Therefore, the first non-idle linked list is searched from linked list of n+1. Bits 0 to n of the BitMap copy can be cleared first, and then a subscript of the leftmost 1 of the copy is obtained. If the subscript is not equal to 31, the subscript is the array index of the first non-empty idle linked list. + +All idle blocks are connected in series in the form of a bidirectional idle linked list. If the first idle block obtained from the linked list is large, that is, after a usSize memory block is split, the remaining space can be allocated at least once, The remaining idle blocks are added to the corresponding idle linked list. + +![](./figures/MemoryApplication.png) + +The memory control header records the size of the idle memory block (including the control header itself). The memory control header contains a reused member at the beginning. When a memory block is idle, it is used as a pointer to the next idle memory block. When a memory block is occupied, it stores a magic number, indicating that the memory block is not idle. To prevent the magic number from conflicting with the pointer (same as the address value), the upper and lower four bits of the magic number are 0xf. The start addresses of the allocated memory blocks are 4-byte-aligned. Therefore, no conflict occurs. + +#### Memory Release + +When the memory is released, adjacent idle blocks are combined. First, the validity of the address parameter (**pAddr**) is determined by checking the magic number in the control header. The start address of the control header of the next memory block is obtained by adding the start address to the offset value. If the next memory block is idle, the next memory block is deleted from the idle linked list to which it belongs, and the size of the current memory block is adjusted. + +To quickly find the control header of the previous memory block and determine whether the previous memory block is idle during memory release, a member is added to the memory control header to mark whether the previous memory block is idle. When the memory is applied for, the flag of the next memory block can be set to the occupied state (if the idle memory block is divided into two, and the previous memory block is idle, the flag of the current memory block is set to the idle state). When the memory is released, the flag of the next memory block is set to the idle state. When the current memory is released, if the previous memory block is marked as occupied, the previous memory block does not need to be merged; if the previous memory block is marked as idle, the previous memory block needs to be merged. If a memory block is idle, the flag of the next control block is set to the distance to the current control block. + + ![](./figures/MemoryRelease.png) + +## Timer Management + +UniProton provides the software timer function to meet the requirements of timing services. + +Software timers are based on the tick interrupts. Therefore, the period of a timer must be an integral multiple of the tick. The timeout scanning of the software timer is performed in the tick handler function. + +Currently, the software timer interface can be used to create, start, stop, restart, and delete timers. + +## Semaphore Management + +A semaphore is typically used to coordinate a group of competing tasks to access to critical resources. When a mutex is required, the semaphore is used as a critical resource counter. Semaphores include intra-core semaphores and inter-core semaphores. + +The semaphore object has an internal counter that supports the following operations: + +- Pend: The Pend operation waits for the specified semaphore. If the counter value is greater than 0, it is decreased by 1 and a success message is returned. If the counter value of the semaphore is 0, the requesting task is blocked until another task releases the semaphore. The amount of time the task will wait for the semaphore is user configurable. + +- Post: The Post operation releases the specified semaphore. If no task is waiting for the semaphore, the counter is incremented by 1 and returned. Otherwise, the first task (the earliest blocked task) in the list of tasks pending for this semaphore is woken up. + +The counter value of a semaphore corresponds to the number of available resources. It means mutually exclusive resources remained that could be occupied. The counter value can be: + +- 0, indicating that there is no accumulated post operation, and there may be a task blocked on the semaphore. + +- A positive value, indicating that there are one or more post release operations. + +## Exception Management + +Exception takeover of UniProton is a maintenance and test feature that records as much information as possible when an exception occurs to facilitate subsequent fault locating. In addition, the exception hook function is provided so that users can perform special handling when an exception occurs. The exception takeover feature handles internal exceptions and external hardware exceptions. + +## CPU Usage Statistics + +The system CPU usage (CPU percentage, CPUP) in UniProton refers to the CPU usage of the system within a period of time. It reflects the CPU load and the system running status (idle or busy) in the given period of time. The valid range of the system CPUP is 0 to 10000, in basis points. 10000 indicates that the system is fully loaded. + +The thread CPUP refers to the CPU usage of a single thread. It reflects the thread status, busy or idle, in a period of time. The valid range of the thread CPUP is 0 to 10000, in basis points. 10000 indicates that the process is being executed for a period of time. The total CPUPs of all threads (including interrupts and idle tasks) in a single-core system is 10000. + +The system-level CPUP statistics of UniProton depends on the tick module, which is implemented by tick sampling idle tasks or idle software interrupt counter. + +## STM32F407ZGT6 Development Board Support + +The kernel peripheral startup process and board driver of UniProton supports the STM32F407ZGT6 development board. The directory structure is as follows: + +├─apps # Demo based on the real-time OS of UniProton +│ └─hello_world # hello_world example program +├─bsp # Board-level driver to interconnect with the OS +├─build # Build script to build the final image +├─config # Configuration items to adjust running parameters +├─include # APIs provided by the real-time OS of UniProton +└─libs # Static libraries of the real-time OS of UniProton. The makefile example in the build directory has prepared the reference of the header file and static libraries. + +## OpenAMP Hybrid Deployment + +OpenAMP is an open source software framework designed to standardize the interaction between environments in heterogeneous embedded systems through open source solutions based on asymmetric multi-processing. OpenAMP consists of the following components: + +1. Remoteproc manages the life cycle of the slave core, shared memory, and resources such as buffer and vring used for communication, and initializes RPMsg and virtio. +2. RPMsg enables multi-core communication based on virtio. +3. Virtio, which is a paravirtualization technology, uses a set of virtual I/Os to implement driver communication between the master and slave cores. +4. libmetal shields OS implementation details, provides common user APIs to access devices, and handles device interrupts and memory requests. + +## POSIX Standard APIs + +[UniProton supports POSIX standard APIs](./uniproton_apis.md). + +## Device Drivers + +UniProton's driver architecture follows a Linux-like approach, treating devices as files through its Virtual File System (VFS). Drivers register with the file system via registration interfaces, enabling applications to access hardware through standard system calls. Adapted from Nuttx's open-source RTOS driver module, the framework maintains Nuttx-compatible interfaces. The file_operations structure (defined in fs.h) stores device operation methods, while register_driver associates devices with their inode structures that describe node locations and data. System calls reference these inodes to locate corresponding driver functions. For interface specifications, see [UniProton APIs](./uniproton_apis.md). + +## Shell Commands + +UniProton features a shell interface for command-line interaction with OS services, parsing user input and processing system outputs. Adapted from LiteOS's shell module, it supports custom command creation (requiring recompilation). Current implementation includes only the help command, with more commands planned for future releases. + +| Interface | Description | +| :---: | :--: | +| SHELLCMD_ENTRY | Static command registration | +| osCmdReg | Dynamic command registration | + +Static registration (5 parameters) typically handles system commands, while dynamic registration (4 parameters) manages user commands. Both share four common parameters after the static method's unique first parameter. Details in [UniProton APIs](./uniproton_apis.md). diff --git a/doc/user_guide/_toc.yaml b/docs/zh/_toc.yaml similarity index 100% rename from doc/user_guide/_toc.yaml rename to docs/zh/_toc.yaml diff --git a/docs/zh/figures/FCS.png b/docs/zh/figures/FCS.png new file mode 100644 index 0000000000000000000000000000000000000000..afb47c557755c10a3f0b196b7080b16a0f86ab6a GIT binary patch literal 22115 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 literal 0 HcmV?d00001 diff --git a/docs/zh/figures/MemoryRelease.png b/docs/zh/figures/MemoryRelease.png new file mode 100644 index 0000000000000000000000000000000000000000..f91c89bb02311f104949e2af42cddc4a3faaaca3 GIT binary patch literal 10618 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 b55LZ8wvv0OYDU-yz(0L$W374(=lK5xTFYw6 literal 0 HcmV?d00001 diff --git a/docs/zh/figures/post_semaphore.png b/docs/zh/figures/post_semaphore.png new file mode 100644 index 0000000000000000000000000000000000000000..fa08d76dafd335b60838dda08db61ccadd8c6b8d GIT binary patch literal 26707 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

!lB6}pF< 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 xr5d<>eo Date: Fri, 5 Sep 2025 15:12:05 +0800 Subject: [PATCH 2/3] docs: delete docs folder Delete docs folder Signed-off-by: chopupu --- docs/en/_toc.yaml | 10 - docs/en/figures/FCS.png | Bin 22115 -> 0 bytes docs/en/figures/MemoryApplication.png | Bin 6386 -> 0 bytes docs/en/figures/MemoryRelease.png | Bin 10618 -> 0 bytes docs/en/figures/pend_semaphore.png | Bin 32691 -> 0 bytes docs/en/figures/post_semaphore.png | Bin 26707 -> 0 bytes docs/en/overview.md | 11 - docs/en/uniproton_apis.md | 3 - docs/en/uniproton_functions.md | 151 - docs/zh/_toc.yaml | 10 - docs/zh/figures/FCS.png | Bin 22115 -> 0 bytes docs/zh/figures/MemoryApplication.png | Bin 6386 -> 0 bytes docs/zh/figures/MemoryRelease.png | Bin 10618 -> 0 bytes docs/zh/figures/pend_semaphore.png | Bin 32691 -> 0 bytes docs/zh/figures/post_semaphore.png | Bin 26707 -> 0 bytes docs/zh/overview.md | 11 - docs/zh/uniproton-apis.md | 6311 ------------------------- docs/zh/uniproton-functions.md | 195 - 18 files changed, 6702 deletions(-) delete mode 100644 docs/en/_toc.yaml delete mode 100644 docs/en/figures/FCS.png delete mode 100644 docs/en/figures/MemoryApplication.png delete mode 100644 docs/en/figures/MemoryRelease.png delete mode 100644 docs/en/figures/pend_semaphore.png delete mode 100644 docs/en/figures/post_semaphore.png delete mode 100644 docs/en/overview.md delete mode 100644 docs/en/uniproton_apis.md delete mode 100644 docs/en/uniproton_functions.md delete mode 100644 docs/zh/_toc.yaml delete mode 100644 docs/zh/figures/FCS.png delete mode 100644 docs/zh/figures/MemoryApplication.png delete mode 100644 docs/zh/figures/MemoryRelease.png delete mode 100644 docs/zh/figures/pend_semaphore.png delete mode 100644 docs/zh/figures/post_semaphore.png delete mode 100644 docs/zh/overview.md delete mode 100644 docs/zh/uniproton-apis.md delete mode 100644 docs/zh/uniproton-functions.md diff --git a/docs/en/_toc.yaml b/docs/en/_toc.yaml deleted file mode 100644 index 02572774..00000000 --- a/docs/en/_toc.yaml +++ /dev/null @@ -1,10 +0,0 @@ -label: UniProton User Guide -isManual: true -description: UniProton is an OS tailored for embedded environments. It offers task and memory management, interrupt handling, and advanced debugging features. -sections: - - label: Overview - href: ./overview.md - - label: UniProton Feature Design - href: ./uniproton_functions.md - - label: UniProton Interfaces - href: ./uniproton_apis.md diff --git a/docs/en/figures/FCS.png b/docs/en/figures/FCS.png deleted file mode 100644 index afb47c557755c10a3f0b196b7080b16a0f86ab6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22115 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 diff --git a/docs/en/figures/MemoryRelease.png b/docs/en/figures/MemoryRelease.png deleted file mode 100644 index f91c89bb02311f104949e2af42cddc4a3faaaca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10618 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 b55LZ8wvv0OYDU-yz(0L$W374(=lK5xTFYw6 diff --git a/docs/en/figures/post_semaphore.png b/docs/en/figures/post_semaphore.png deleted file mode 100644 index fa08d76dafd335b60838dda08db61ccadd8c6b8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26707 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

!lB6}pF< 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 xr5d<>eo. diff --git a/docs/en/uniproton_apis.md b/docs/en/uniproton_apis.md deleted file mode 100644 index 87ed2109..00000000 --- a/docs/en/uniproton_apis.md +++ /dev/null @@ -1,3 +0,0 @@ -# UniProton APIs - -This document is currently not available in English. diff --git a/docs/en/uniproton_functions.md b/docs/en/uniproton_functions.md deleted file mode 100644 index 730c0ad0..00000000 --- a/docs/en/uniproton_functions.md +++ /dev/null @@ -1,151 +0,0 @@ -# UniProton Feature Design - -## Task Management - -UniProton is a single-process multi-thread operating system (OS). In UniProton, a task represents a thread. Tasks in UniProton are scheduled in preemption mode instead of time slice rotation scheduling. High-priority tasks can interrupt low-priority tasks. Low-priority tasks can be scheduled only after high-priority tasks are suspended or blocked. - -A total of 32 priorities are defined, with priority 0 being the highest and 31 being the lowest. Multiple tasks can be created in a priority. - -The task management module of UniProton provides the following functions: Creates, deletes, suspends, resumes, and delays tasks; Locks and unlocks task scheduling; Obtains the current task ID; Obtains and sets task private data; Query the pending semaphore ID of a specified task; Query the status, context, and general information of a specified task; Obtains and sets task priorities; Adjusts the task scheduling order of a specified priority; Register and unregister hooks for task creation, deletion, and switching. During initialization, UniProton creates an idle task with the lowest priority by default. When no task is in the running status, the idle task is executed. - -## Event Management - -The event mechanism enables communication between threads. Event communication can only be event notifications and no data is transmitted. - -As an extension of tasks, events allow tasks to communicate with each other. Each task supports 32 event types, each represented by a bit of a 32-bit value. - -UniProton can read current task events and write specified task events. Multiple event types can be read or written at one time. - -## Queue Management - -A queue, also called message queue, is a method commonly used for inter-thread communication to store and transfer data. Data can be written to the head or tail of a queue based on the priority, but can be read only from the head of a queue. - -When creating a queue, UniProton allocates memory space for the queue based on the queue length and message unit size input by the user. The queue control block contains **Head** and **Tail** pointers, which indicate the storage status of data in a queue. **Head** indicates the start position of occupied message nodes in the queue. **Tail** indicates the end position of the occupied message nodes in the queue. - -## Hard Interrupt Management - -A hardware interrupt is a level signal that is triggered by hardware and affects system running. A hardware interrupt is used to notify the CPU of a hardware event. Hardware interrupts include maskable interrupts and non-maskable interrupts (NMIs). - -Hardware interrupts have different internal priorities, but they all have a higher priority than other tasks. When multiple hardware interrupts are triggered at the same time, the hardware interrupt with the highest priority is always responded first. Whether a high-priority hardware interrupt can interrupt a low-priority hardware interrupt that is being executed (that is, nested interrupts) depends on the chip platform. - -The OS creates a tick hardware interrupt during initialization for task delay and software timer purposes. The tick is essentially a hardware timer. - -## Memory Management - -Memory management is to dynamically divide and manage large memory areas allocated by users. When a section of a program needs to use the memory, the program calls the memory application function of the OS to obtain the memory block of a specified size. After using the memory, the program calls the memory release function to release the occupied memory. - -UniProton provides the FSC memory algorithm. The following table lists the advantages, disadvantages, and application scenarios of FSC. - -| Algorithm | Advantages | Disadvantages | Application Scenarios | -| :----------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------ | ------------------------------------ | -| Private FSC algorithm| The memory control block information occupies a small amount of memory. The minimum 4-byte-aligned memory block size can be applied for. Adjacent memory blocks can be quickly split and merged without creating memory fragmentation.| The efficiency of memory application and release is low.| It can flexibly adapt to various product scenarios.| - -The FSC memory algorithm is described as follows: - -### FSC Memory Algorithm - -#### Core Idea - -The size of the requested memory is **uwSize**. If the size is in binary, it is expressed as **0b{0}1xxx**. **{0}** indicates that there may be one or more zeros before **1**. Regardless of the content of following **1** (**xxx**), if **1** is changed to **10** and **xxx** is changed to **0**, **10yyy** is always greater than **1xxx** (**yyy** indicates that the corresponding bits of **xxx** are changed to **0**). - -The subscript of the leftmost 1 can be directly obtained. The subscript values are 0 to 31 from the most significant bit to the least significant bit (BitMap), or 0 to 31 from the least significant bit to the most significant bit (uwSize). If the subscripts of the bits of the 32-bit register are 0 to 31 from the most significant bit to the least significant bit, the subscript of the leftmost 1 of 0x80004000 is 0. Therefore, we can maintain an idle linked list header array (the number of elements does not exceed 31). The subscript of the leftmost 1 of the memory block size is used as the index of the linked list header array. That is, all memory blocks with the same subscript of the leftmost 1 are mounted to the same idle linked list. - -For example, the sizes of idle blocks that can be mounted to the linked list whose index is 2 are 4, 5, 6, and 7, and the sizes of idle blocks that can be mounted to the linked list whose index is N are 2^N to 2^(N+1)-1. - -![](./figures/FCS.png) - -#### Memory Application - -When applying for the memory of uwSize, use assembly instructions to obtain the subscript of the leftmost 1 first. Assume that the subscript is **n**. To ensure that the first idle memory block in the idle linked list meets the uwSize requirement, the search starts from the index n+1. If the idle linked list of index n+1 is not empty, the first idle block in the linked list is used. If the linked list of n+1 is empty, the linked list of n+2 is checked, and so on, until a non-empty linked list is found or the index reaches 31. - -A 32-bit BitMap global variable is defined to prevent the for loop from checking whether the idle linked list is empty recursively. If the idle linked list of n is not empty, the value whose subscript is n of BitMap is set to 1. Otherwise, the value is set to 0. The bit whose subscript is 31 of the BitMap is directly set to 1 during initialization. Therefore, the first non-idle linked list is searched from linked list of n+1. Bits 0 to n of the BitMap copy can be cleared first, and then a subscript of the leftmost 1 of the copy is obtained. If the subscript is not equal to 31, the subscript is the array index of the first non-empty idle linked list. - -All idle blocks are connected in series in the form of a bidirectional idle linked list. If the first idle block obtained from the linked list is large, that is, after a usSize memory block is split, the remaining space can be allocated at least once, The remaining idle blocks are added to the corresponding idle linked list. - -![](./figures/MemoryApplication.png) - -The memory control header records the size of the idle memory block (including the control header itself). The memory control header contains a reused member at the beginning. When a memory block is idle, it is used as a pointer to the next idle memory block. When a memory block is occupied, it stores a magic number, indicating that the memory block is not idle. To prevent the magic number from conflicting with the pointer (same as the address value), the upper and lower four bits of the magic number are 0xf. The start addresses of the allocated memory blocks are 4-byte-aligned. Therefore, no conflict occurs. - -#### Memory Release - -When the memory is released, adjacent idle blocks are combined. First, the validity of the address parameter (**pAddr**) is determined by checking the magic number in the control header. The start address of the control header of the next memory block is obtained by adding the start address to the offset value. If the next memory block is idle, the next memory block is deleted from the idle linked list to which it belongs, and the size of the current memory block is adjusted. - -To quickly find the control header of the previous memory block and determine whether the previous memory block is idle during memory release, a member is added to the memory control header to mark whether the previous memory block is idle. When the memory is applied for, the flag of the next memory block can be set to the occupied state (if the idle memory block is divided into two, and the previous memory block is idle, the flag of the current memory block is set to the idle state). When the memory is released, the flag of the next memory block is set to the idle state. When the current memory is released, if the previous memory block is marked as occupied, the previous memory block does not need to be merged; if the previous memory block is marked as idle, the previous memory block needs to be merged. If a memory block is idle, the flag of the next control block is set to the distance to the current control block. - - ![](./figures/MemoryRelease.png) - -## Timer Management - -UniProton provides the software timer function to meet the requirements of timing services. - -Software timers are based on the tick interrupts. Therefore, the period of a timer must be an integral multiple of the tick. The timeout scanning of the software timer is performed in the tick handler function. - -Currently, the software timer interface can be used to create, start, stop, restart, and delete timers. - -## Semaphore Management - -A semaphore is typically used to coordinate a group of competing tasks to access to critical resources. When a mutex is required, the semaphore is used as a critical resource counter. Semaphores include intra-core semaphores and inter-core semaphores. - -The semaphore object has an internal counter that supports the following operations: - -- Pend: The Pend operation waits for the specified semaphore. If the counter value is greater than 0, it is decreased by 1 and a success message is returned. If the counter value of the semaphore is 0, the requesting task is blocked until another task releases the semaphore. The amount of time the task will wait for the semaphore is user configurable. - -- Post: The Post operation releases the specified semaphore. If no task is waiting for the semaphore, the counter is incremented by 1 and returned. Otherwise, the first task (the earliest blocked task) in the list of tasks pending for this semaphore is woken up. - -The counter value of a semaphore corresponds to the number of available resources. It means mutually exclusive resources remained that could be occupied. The counter value can be: - -- 0, indicating that there is no accumulated post operation, and there may be a task blocked on the semaphore. - -- A positive value, indicating that there are one or more post release operations. - -## Exception Management - -Exception takeover of UniProton is a maintenance and test feature that records as much information as possible when an exception occurs to facilitate subsequent fault locating. In addition, the exception hook function is provided so that users can perform special handling when an exception occurs. The exception takeover feature handles internal exceptions and external hardware exceptions. - -## CPU Usage Statistics - -The system CPU usage (CPU percentage, CPUP) in UniProton refers to the CPU usage of the system within a period of time. It reflects the CPU load and the system running status (idle or busy) in the given period of time. The valid range of the system CPUP is 0 to 10000, in basis points. 10000 indicates that the system is fully loaded. - -The thread CPUP refers to the CPU usage of a single thread. It reflects the thread status, busy or idle, in a period of time. The valid range of the thread CPUP is 0 to 10000, in basis points. 10000 indicates that the process is being executed for a period of time. The total CPUPs of all threads (including interrupts and idle tasks) in a single-core system is 10000. - -The system-level CPUP statistics of UniProton depends on the tick module, which is implemented by tick sampling idle tasks or idle software interrupt counter. - -## STM32F407ZGT6 Development Board Support - -The kernel peripheral startup process and board driver of UniProton supports the STM32F407ZGT6 development board. The directory structure is as follows: - -├─apps # Demo based on the real-time OS of UniProton -│ └─hello_world # hello_world example program -├─bsp # Board-level driver to interconnect with the OS -├─build # Build script to build the final image -├─config # Configuration items to adjust running parameters -├─include # APIs provided by the real-time OS of UniProton -└─libs # Static libraries of the real-time OS of UniProton. The makefile example in the build directory has prepared the reference of the header file and static libraries. - -## OpenAMP Hybrid Deployment - -OpenAMP is an open source software framework designed to standardize the interaction between environments in heterogeneous embedded systems through open source solutions based on asymmetric multi-processing. OpenAMP consists of the following components: - -1. Remoteproc manages the life cycle of the slave core, shared memory, and resources such as buffer and vring used for communication, and initializes RPMsg and virtio. -2. RPMsg enables multi-core communication based on virtio. -3. Virtio, which is a paravirtualization technology, uses a set of virtual I/Os to implement driver communication between the master and slave cores. -4. libmetal shields OS implementation details, provides common user APIs to access devices, and handles device interrupts and memory requests. - -## POSIX Standard APIs - -[UniProton supports POSIX standard APIs](./uniproton_apis.md). - -## Device Drivers - -UniProton's driver architecture follows a Linux-like approach, treating devices as files through its Virtual File System (VFS). Drivers register with the file system via registration interfaces, enabling applications to access hardware through standard system calls. Adapted from Nuttx's open-source RTOS driver module, the framework maintains Nuttx-compatible interfaces. The file_operations structure (defined in fs.h) stores device operation methods, while register_driver associates devices with their inode structures that describe node locations and data. System calls reference these inodes to locate corresponding driver functions. For interface specifications, see [UniProton APIs](./uniproton_apis.md). - -## Shell Commands - -UniProton features a shell interface for command-line interaction with OS services, parsing user input and processing system outputs. Adapted from LiteOS's shell module, it supports custom command creation (requiring recompilation). Current implementation includes only the help command, with more commands planned for future releases. - -| Interface | Description | -| :---: | :--: | -| SHELLCMD_ENTRY | Static command registration | -| osCmdReg | Dynamic command registration | - -Static registration (5 parameters) typically handles system commands, while dynamic registration (4 parameters) manages user commands. Both share four common parameters after the static method's unique first parameter. Details in [UniProton APIs](./uniproton_apis.md). diff --git a/docs/zh/_toc.yaml b/docs/zh/_toc.yaml deleted file mode 100644 index 4172c8f5..00000000 --- a/docs/zh/_toc.yaml +++ /dev/null @@ -1,10 +0,0 @@ -label: UniProton用户指南 -isManual: true -description: UniProton是面向嵌入式场景的操作系统,支持任务和内存管理、中断处理,提供强大调试能力 -sections: - - label: 概述 - href: ./overview.md - - label: UniProton功能设计 - href: ./uniproton-functions.md - - label: UniProton接口说明 - href: ./uniproton-apis.md diff --git a/docs/zh/figures/FCS.png b/docs/zh/figures/FCS.png deleted file mode 100644 index afb47c557755c10a3f0b196b7080b16a0f86ab6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22115 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 diff --git a/docs/zh/figures/MemoryRelease.png b/docs/zh/figures/MemoryRelease.png deleted file mode 100644 index f91c89bb02311f104949e2af42cddc4a3faaaca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10618 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 b55LZ8wvv0OYDU-yz(0L$W374(=lK5xTFYw6 diff --git a/docs/zh/figures/post_semaphore.png b/docs/zh/figures/post_semaphore.png deleted file mode 100644 index fa08d76dafd335b60838dda08db61ccadd8c6b8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26707 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

!lB6}pF< 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 xr5d<>eodouble类型的浮点数x | 支持 | -| [atan2f](#atan2f) | 计算参数y除以x的反正切值,使用两个参数的符号确定返回值的象限 | float类型的浮点数y
float类型的浮点数x | 支持 | -| [atan2l](#atan2l) | 计算参数y除以x的反正切值,使用两个参数的符号确定返回值的象限 | long double类型的浮点数y
long double类型的浮点数x | 支持 | -| [atanh](#atanh) | 计算参数x的反双曲正切值,返回类型double | double类型的浮点数x | 支持 | -| [atanhf](#atanhf) | 计算参数x的反双曲正切值,返回类型float | float类型的浮点数x | 支持 | -| [atanhl](#atanhl) | 计算参数x的反双曲正切值,返回类型long double | long double类型的浮点数x | 支持 | -| [cbrt](#cbrt) | 计算参数x的立方根,返回类型double | double类型的浮点数x | 支持 | -| [cbrtf](#cbrtf) | 计算参数x的立方根,返回类型float | float类型的浮点数x | 支持 | -| [cbrtl](#cbrtl) | 计算参数x的立方根,返回类型long double | long double类型的浮点数x | 支持 | -| [ceil](#ceil) | 计算不小于参数x的最小整数值,返回类型double | duoble类型的浮点数x | 支持 | -| [ceilf](#ceilf) | 计算不小于参数x的最小整数值,返回类型float | float类型的浮点数x | 支持 | -| [ceill](#ceill) | 计算不小于参数x的最小整数值,返回类型long double | long duoble类型的浮点数x | 支持 | -| [copysign](#copysign) | 生成一个值,该值具有参数x的大小和参数y的符号 | duoble类型的浮点数x
double类型的浮点数y | 支持 | -| [copysignf](#copysignf) | 生成一个值,该值具有参数x的大小和参数y的符号 | float类型的浮点数x
float类型的浮点数y | 支持 | -| [copysignl](#copysignl) | 生成一个值,该值具有参数x的大小和参数y的符号 | long duoble类型的浮点数x
long double类型的浮点数y | 支持 | -| [cos](#cos) | 计算参数x的余弦值,参数应为弧度值,返回类型double | duoble类型的浮点数x | 支持 | -| [cosf](#cosf) | 计算参数x的余弦值,参数应为弧度值,返回类型float | float类型的浮点数x | 支持 | -| [cosl](#cosl) | 计算参数x的余弦值,参数应为弧度值,返回类型long double | long double类型的浮点数x | 支持 | -| [cosh](#cosh) | 计算参数x的双曲余弦值,返回类型double | double类型的浮点数x | 支持 | -| [coshf](#coshf) | 计算参数x的双曲余弦值,返回类型float | float类型的浮点数x | 支持 | -| [coshl](#coshl) | 计算参数x的双曲余弦值,返回类型long double | long double类型的浮点数x | 支持 | -| [erf](#erf) | 计算参数x的高斯误差函数的值 | double类型的浮点数x | 支持 | -| [erff](#erff) | 计算参数x的高斯误差函数的值 | float类型的浮点数x | 支持 | -| [erfl](#erfl) | 计算参数x的高斯误差函数的值 | long double类型的浮点数x | 支持 | -| [erfc](#erfc) | 计算参数x的高斯误差函数的值 | double类型的浮点数x | 支持 | -| [erfcf](#erfcf) | 计算参数x的互补误差函数的值 | float类型的浮点数x | 支持 | -| [erfcl](#erfcl) | 计算参数x的互补误差函数的值 | long double类型的浮点数x | 支持 | -| [exp](#exp) | 以e为基数的指数,即$e^x$的值,返回类型double | double类型的浮点数x | 支持 | -| [expf](#expf) | 以e为基数的指数,即$e^x$的值,返回类型float | float类型的浮点数x | 支持 | -| [expl](#expl) | 以e为基数的指数,即$e^x$的值,返回类型long double | long double类型的浮点数x | 支持 | -| [exp10](#exp10) | 以10为基数的指数,即$10^x$的值,返回类型double | double类型的浮点数x | 支持 | -| [exp10f](#exp10f) | 以10为基数的指数,即$10^x$的值,返回类型float | float类型的浮点数x | 支持 | -| [exp10l](#exp10l) | 以10为基数的指数,即$10^x$的值,返回类型long double | long double类型的浮点数x | 支持 | -| [exp2](#exp2) | 以2为基数的指数函数,返回类型double | double类型的浮点数x | 支持 | -| [exp2f](#exp2f) | 以2为基数的指数函数,返回类型float | float类型的浮点数x | 支持 | -| [exp2l](#exp2l) | 以2为基数的指数函数,返回类型long double | long double类型的浮点数x | 支持 | -| [expm1](#expm1) | 计算$e^x - 1$的值。如果参数x是个小值,expm1(x)函数的值比表达式$e^x - 1$更准确 | double类型的浮点数x | 支持 | -| [expm1f](#expm1f) | 计算$e^x - 1$的值。如果参数x是个小值,expm1(x)函数的值比表达式$e^x - 1$更准确 | float类型的浮点数x | 支持 | -| [expm1l](#expm1l) | 计算$e^x - 1$的值。如果参数x是个小值,expm1(x)函数的值比表达式$e^x - 1$更准确 | long double类型的浮点数x | 支持 | -| [fabs](#fabs) | 计算参数x的绝对值,返回类型double | double类型的浮点数x | 支持 | -| [fabsf](#fabsf) | 计算参数x的绝对值,返回类型float | float类型的浮点数x | 支持 | -| [fabsl](#fabsl) | 计算参数x的绝对值,返回类型long double | long double类型的浮点数x | 支持 | -| [fdim](#fdim) | 计算参数x和参数y之间的正差值 | double类型的浮点数x
double类型的浮点数y | 支持 | -| [fdimf](#fdimf) | 计算参数x和参数y之间的正差值 | float类型的浮点数x
float类型的浮点数y | 支持 | -| [fdiml](#fdiml) | 计算参数x和参数y之间的正差值 | long double类型的浮点数x
long double类型的浮点数y | 支持 | -| [finite](#finite) | 如果参数x既不是无限值也不是NaN,则返回一个非零值,否则返回0 | double类型的浮点数x | 支持 | -| [finitef](#finitef) | 如果参数x既不是无限值也不是NaN,则返回一个非零值,否则返回0 | float类型的浮点数x| 支持 | -| [floor](#floor) | 计算不大于参数x到最大整数值,返回类型double | double类型的浮点数x | 支持 | -| [floorf](#floorf) | 计算不大于参数x到最大整数值,返回类型float | float类型的浮点数x | 支持 | -| [floorl](#floorl) | 计算不大于参数x到最大整数值,返回类型long double | long double类型的浮点数x | 支持 | -| [fma](#fma) | 计算表达式$(x * y) + z$的值,返回double类型 | double类型的浮点数x
double类型的浮点数y
double类型的浮点数z | 支持 | -| [fmaf](#fmaf) | 计算表达式$(x * y) + z$的值,返回float类型 | float类型的浮点数x
float类型的浮点数y
float类型的浮点数z | 支持 | -| [fmal](#fmal) | 计算表达式$(x * y) + z$的值,返回long double类型 | long double类型的浮点数x
long double类型的浮点数y
long double类型的浮点数z | 支持 | -| [fmax](#fmax) | 确定其参数的最大数值。如果一个参数是非数值(NaN),另一个参数是数值,fmax函数将选择数值 | double类型的浮点数x
double类型的浮点数y | 支持 | -| [fmaxf](#fmaxf) | 确定其参数的最大数值。如果一个参数是非数值(NaN),另一个参数是数值,fmax函数将选择数值 | float类型的浮点数x
float类型的浮点数y | 支持 | -| [fmaxl](#fmaxl) | 确定其参数的最大数值。如果一个参数是非数值(NaN),另一个参数是数值,fmax函数将选择数值 | long double类型的浮点数x
long double类型的浮点数y | 支持 | -| [fmin](#fmin) | 返回其参数的最小数值。非数值NaN参数视为缺失数据。如果一个参数是非数值,另一个参数是数值,fmin函数将选择数值 | double类型的浮点数x
double类型的浮点数y | 支持 | -| [fminf](#fminf) | 返回其参数的最小数值。非数值NaN参数视为缺失数据。如果一个参数是非数值,另一个参数是数值,fmin函数将选择数值 | float类型的浮点数x
float类型的浮点数y | 支持 | -| [fminl](#fminl) | 返回其参数的最小数值。非数值NaN参数视为缺失数据。如果一个参数是非数值,另一个参数是数值,fmin函数将选择数值 | long double类型的浮点数x
long double类型的浮点数y | 支持 | -| [fmod](#fmod) | 计算表达式x/y的浮点余数,返回double类型 | double类型的浮点数x
double类型的浮点数y | 支持 | -| [fmodf](#fmodf) | 计算表达式x/y的浮点余数,返回float类型 | float类型的浮点数x
float类型的浮点数y | 支持 | -| [fmodl](#fmodl) | 计算表达式x/y的浮点余数,返回long double类型 | long double类型的浮点数x
long double类型的浮点数y | 支持 | -| [frexp](#frexp) | 将浮点数分解为规格化小数和2的整数幂,并将整数存入参数exp指向的对象中 | double类型的浮点数x
int *类型的浮点数y | 支持 | -| [frexpf](#frexpf) | 将浮点数分解为规格化小数和2的整数幂,并将整数存入参数exp指向的对象中 | float类型的浮点数x
int *类型的浮点数y | 支持 | -| [frexpl](#frexpl) | 将浮点数分解为规格化小数和2的整数幂,并将整数存入参数exp指向的对象中 | long double类型的浮点数x
int *类型的浮点数y | 支持 | -| [hypot](#hypot) | 计算表达式$(x^2 + y^2)^{1/2}$的值 | double类型的浮点数x
double类型的浮点数y | 支持 | -| [hypotf](#hypotf) | 计算表达式$(x^2 + y^2)^{1/2}$的值 | float类型的浮点数x
float类型的浮点数y | 支持 | -| [hypotl](#hypotl) | 计算表达式$(x^2 + y^2)^{1/2}$的值 | long double类型的浮点数x
long double类型的浮点数y | 支持 | -| [ilogb](#ilogb) | 以FLT_RADIX作为对数的底数,返回double类型x的对数的整数部分 | double类型的浮点数x | 支持 | -| [ilogbf](#ilogbf) | 以FLT_RADIX作为对数的底数,返回float类型x的对数的整数部分 | float类型的浮点数x | 支持 | -| [ilogbl](#ilogbl) | 以FLT_RADIX作为对数的底数,返回long double类型x的对数的整数部分 | long double类型的浮点数x | 支持 | -| [j0](#j0) | 计算参数x的第一类0阶贝塞尔函数 | double类型浮点数x | 支持 | -| [j0f](#j0f) | 计算参数x的第一类0阶贝塞尔函数 | float类型浮点数x | 支持 | -| [j1](#j1) | 计算参数x的第一类1阶贝塞尔函数 | double类型浮点数x | 支持 | -| [j1f](#j1f) | 计算参数x的第一类1阶贝塞尔函数 | float类型浮点数x | 支持 | -| [jn](#jn) | 计算参数x的第一类n阶贝塞尔函数 | int类型阶数
double类型浮点数x | 支持 | -| [jnf](#jnf) | 计算参数x的第一类n阶贝塞尔函数 | int类型阶数
float类型浮点数x | 支持 | -| [ldexp](#ldexp) | 计算参数x与2的exp次幂的乘积,即返回$x * 2^{exp}$的double类型值。 | double类型的浮点数x
int类型的指数exp | 支持 | -| [ldexpf](#ldexpf) | 计算参数x与2的exp次幂的乘积,即返回$x * 2^{exp}$的float类型值。 | float类型的浮点数x
int类型的指数exp | 支持 | -| [ldexpl](#ldexpl) | 计算参数x与2的exp次幂的乘积,即返回$x * 2^{exp}$的long double类型值。 | long double类型的浮点数x
int类型的指数exp | 支持 | -| [lgamma](#lgamma) | 计算参数x伽玛绝对值的自然对数,返回double类型 | double类型的浮点数x | 支持 | -| [lgammaf](#lgammaf) | 计算参数x伽玛绝对值的自然对数,返回float类型 | float类型的浮点数x | 支持 | -| [lgammal](#lgammal) | 计算参数x伽玛绝对值的自然对数,返回long double类型 | long double类型的浮点数x | 支持 | -| [lgamma_r](#lgamma_r) | 计算参数x伽玛绝对值的自然对数,与lgamma不同在于是线程安全的 | double类型的浮点数x
int *类型符号参数 | 支持 | -| [lgamma_r](#lgamma_r) | 计算参数x伽玛绝对值的自然对数,与lgamma不同在于是线程安全的 | float类型的浮点数x
int *类型符号参数 | 支持 | -| [llrint](#llrint) | 根据当前舍入模式,将参数舍入为long long int类型的最接近整数值 | double类型的浮点数x | 支持 | -| [llrintf](#llrintf) | 根据当前舍入模式,将参数舍入为long long int类型的最接近整数值 | float类型的浮点数x | 支持 | -| [llrintl](#llrintl) | 根据当前舍入模式,将参数舍入为long long int类型的最接近整数值 | long double类型的浮点数x | 支持 | -| [llround](#llround) | 将double类型x舍入为浮点形式表示的long long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | double类型的浮点数x | 支持 | -| [llroundf](#llroundf) | 将float类型x舍入为浮点形式表示的long long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | float类型的浮点数x | 支持 | -| [llroundl](#llroundl) | 将long double类型x舍入为浮点形式表示的long long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | long double类型的浮点数x | 支持 | -| [log](#log) | double类型x的自然对数函数 | double类型的浮点数x | 支持 | -| [logf](#logf) | float类型x的自然对数函数 | float类型的浮点数x | 支持 | -| [logl](#logl) | long double类型x的自然对数函数 | long double类型的浮点数x | 支持 | -| [log10](#log10) | double类型x以10为底数的对数函数 | double类型的浮点数x | 支持 | -| [log10f](#log10f) | float类型x以10为底数的对数函数 | float类型的浮点数x | 支持 | -| [log10l](#log10l) | long double类型x以10为底数的对数函数 | long double类型的浮点数x | 支持 | -| [log1p](#log1p) | 以e为底数的对数函数,计算$log_e(1 + x)$的值。如果参数x是个小值,表达式log1p(x)比表达式log(1 + x)更准确 | double类型的浮点数x | 支持 | -| [log1pf](#log1pf) | 以e为底数的对数函数,计算$log_e(1 + x)$的值。如果参数x是个小值,表达式log1p(x)比表达式log(1 + x)更准确 | float类型的浮点数x | 支持 | -| [log1pl](#log1pl) | 以e为底数的对数函数,计算$log_e(1 + x)$的值。如果参数x是个小值,表达式log1p(x)比表达式log(1 + x)更准确 | long double类型的浮点数x | 支持 | -| [log2](#log2) | double类型x以2为底数的对数函数 | double类型的浮点数x | 支持 | -| [log2f](#log2f) | float类型x以2为底数的对数函数 | flaot类型的浮点数x | 支持 | -| [log2l](#log2l) | long double类型x以2为底数的对数函数 | long double类型的浮点数x | 支持 | -| [logb](#logb) | double类型x以FLT_RADIX为的底数到对数函数 | double类型的浮点数x | 支持 | -| [logbf](#logbf) | float类型x以FLT_RADIX为的底数到对数函数 | float类型的浮点数x | 支持 | -| [logbl](#logbl) | double类型x以FLT_RADIX为的底数到对数函数 | double类型的浮点数x | 支持 | -| [lrint](#lrint) | 根据当前舍入模式,将参数舍入为long int类型的最接近整数值 | double类型的浮点数x | 支持 | -| [lrintf](#lrintf) | 根据当前舍入模式,将参数舍入为long int类型的最接近整数值 | float类型的浮点数x | 支持 | -| [lrintl](#lrintl) | 根据当前舍入模式,将参数舍入为long int类型的最接近整数值 | long double类型的浮点数x | 支持 | -| [lround](#lround) | 将double类型x舍入为浮点形式表示的long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | double类型的浮点数x | 支持 | -| [lroundf](#lroundf) | 将float类型x舍入为浮点形式表示的long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | float类型的浮点数x | 支持 | -| [lroundl](#lroundl) | 将long double类型x舍入为浮点形式表示的long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | long double类型的浮点数x | 支持 | -| [modf](#modf) | 将double类型的参数value分成整数部分和小数部分,两部分与参数value具有相同的类型和符号。整数部分以浮点形式存入参数iptr指向的对象中 | double类型的浮点数value
double *类型的指数iptr | 支持 | -| [modff](#modff) | 将float类型的参数value分成整数部分和小数部分,两部分与参数value具有相同的类型和符号。整数部分以浮点形式存入参数iptr指向的对象中 | float类型的浮点数value
float *类型的指数iptr | 支持 | -| [modfl](#modfl) | 将long double类型的参数value分成整数部分和小数部分,两部分与参数value具有相同的类型和符号。整数部分以浮点形式存入参数iptr指向的对象中 | long double类型的浮点数value
long double *类型的指数iptr | 支持 | -| [nan](#nan) | 返回一个double类型的非数值NaN,内容由参数tagp确定 | const char*类型tagp | 支持 | -| [nanf](#nanf) | 返回一个float类型的非数值NaN,内容由参数tagp确定 | const char*类型tagp | 支持 | -| [nanl](#nanl) | 返回一个long double类型的非数值NaN,内容由参数tagp确定 | const char*类型tagp | 支持 | -| [nearbyint](#nearbyint) | 根据当前舍入模式,将double型参数x舍入为浮点格式的double型整数值 | double类型x | 支持 | -| [nearbyintf](#nearbyintf) | 根据当前舍入模式,将float型参数x舍入为浮点格式的float型整数值 | float类型x | 支持 | -| [nearbyintl](#nearbyintl) | 根据当前舍入模式,将long double型参数x舍入为浮点格式的double型整数值 | long double类型x | 支持 | -| [nextafter](#nextafter) | 返回double类型参数x沿参数y方向的下一个可表示值 | double类型x
double类型y | 支持 | -| [nextafterf](#nextafterf) | 返回double类型参数x沿参数y方向的下一个可表示值 | float类型x
flaot类型y | 支持 | -| [nextafterl](#nextafterl) | 返回double类型参数x沿参数y方向的下一个可表示值 | long double类型x
long double类型y | 支持 | -| [nexttoward](#nexttoward) | 返回double类型参数x沿参数y方向的下一个可表示值,等价于nextafter,区别在于参数y为long double | double类型浮点数x
long double类型浮点数y | 支持 | -| [nexttowardf](#nexttowardf) | 返回double类型参数x沿参数y方向的下一个可表示值,等价于nextafter,区别在于参数y为long double | float类型浮点数x
long double类型浮点数y | 支持 | -| [nexttowardl](#nexttowardl) | 返回double类型参数x沿参数y方向的下一个可表示值,等价于nextafter,区别在于参数y为long double | long double类型浮点数x
long double类型浮点数y | 支持 | -| [pow](#pow) | 计算表达式$x^y$的值 | double类型浮点数x
double类型浮点数y | 支持 | -| [powf](#powf) | 计算表达式$x^y$的值 | float类型浮点数x
float类型浮点数y | 支持 | -| [powl](#powl) | 计算表达式$x^y$的值 | long double类型浮点数x
long double类型浮点数y | 支持 | -| [pow10](#pow10) | 计算表达式$10^x$的值 | double类型浮点数x | 支持 | -| [pow10f](#pow10f) | 计算表达式$10^x$的值 | float类型浮点数x| 支持 | -| [pow10l](#pow10l) | 计算表达式$10^x$的值 | long double类型浮点数x | 支持 | -| [remainder](#remainder) | 计算参数x除以y的余数,等同于drem | double类型浮点数x
double类型浮点数y | 支持 | -| [remainderf](#remainderf) | 计算参数x除以y的余数,等同于dremf | float类型浮点数x
float类型浮点数y | 支持 | -| [remainderl](#remainderl) | 计算参数x除以y的余数 | long double类型浮点数x
long double类型浮点数y | 支持 | -| [remquo](#remquo) | 计算参数x和参数y的浮点余数,并将商保存在传递的参数指针quo中 | double类型浮点数x
double类型浮点数y
int *类型商que | 支持 | -| [remquof](#remquof) | 计算参数x和参数y的浮点余数,并将商保存在传递的参数指针quo中 | float类型浮点数x
float类型浮点数y
int *类型商que | 支持 | -| [remquol](#remquol) | 计算参数x和参数y的浮点余数,并将商保存在传递的参数指针quo中 | long double类型浮点数x
long double类型浮点数y
int *类型商que | 支持 | -| [rint](#rint) | 根据当前舍入模式,将参数x舍入为浮点个数的整数值 | double类型的浮点数x | 支持 | -| [rintf](#rintf) | 根据当前舍入模式,将参数x舍入为浮点个数的整数值 | float类型的浮点数x | 支持 | -| [rintl](#rintl) | 根据当前舍入模式,将参数x舍入为浮点个数的整数值 | long double类型的浮点数x | 支持 | -| [round](#round) | 将double类型x舍入为浮点形式表示的double型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | double类型的浮点数x | 支持 | -| [roundf](#roundf) | 将float类型x舍入为浮点形式表示的float型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | float类型的浮点数x | 支持 | -| [roundl](#roundl) | 将long double类型x舍入为浮点形式表示的long double型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | long double类型的浮点数x | 支持 | -| [scalb](#scalb) | 计算$x * FLT\_RADIX^{exp}$的double类型值 | double类型的浮点数x
double类型的指数exp | 支持 | -| [scalbf](#scalbf) | 计算$x * FLT\_RADIX^{exp}$的float类型值 | float类型的浮点数x
float类型的指数exp | 支持 | -| [scalbln](#scalbln) | 计算$x * FLT\_RADIX^{exp}$的double类型值 | double类型的浮点数x
long类型的指数exp | 支持 | -| [scalblnf](#scalblnf) | 计算$x * FLT\_RADIX^{exp}$的float类型值 | float类型的浮点数x
long类型的指数exp | 支持 | -| [scalblnl](#scalblnl) | 计算$x * FLT\_RADIX^{exp}$的long double类型值 | long double类型的浮点数x
long类型的指数exp | 支持 | -| [scalbn](#scalbn) | 计算$x * FLT\_RADIX^{exp}$的double类型值 | double类型的浮点数x
int类型的指数exp | 支持 | -| [scalbnf](#scalbnf) | 计算$x * FLT\_RADIX^{exp}$的float类型值 | float类型的浮点数x
int类型的指数exp | 支持 | -| [scalbnl](#scalbnl) | 计算$x * FLT\_RADIX^{exp}$的long double类型值 | long double类型的浮点数x
int类型的指数exp | 支持 | -| [significand](#significand) | 用于分离浮点数x的尾数部分,返回double类型 | double类型的浮点数x | 支持 | -| [significandf](#significandf) | 用于分离浮点数x的尾数部分,返回double类型 | double类型的浮点数x | 支持 | -| [sin](#sin) | 计算参数x的正弦值,参数应为弧度值,返回double类型 | double类型的浮点数x | 支持 | -| [sinf](#sinf) | 计算参数x的正弦值,参数应为弧度值,返回float类型 | float类型的浮点数x | 支持 | -| [sinl](#sinl) | 计算参数x的正弦值,参数应为弧度值,返回long double类型 | long double类型的浮点数x | 支持 | -| [sincos](#sincos) | 同时计算参数x的正弦值和余弦值,并将结果存储在*sin和*cos,比单独调用sin和cos效率更高 | double类型的浮点数x
double*类型的浮点数sin
double*类型的浮点数cos | 支持 | -| [sincosf](#sincosf) | 同时计算参数x的正弦值和余弦值,并将结果存储在*sin和*cos,比单独调用sin和cos效率更高 | float类型的浮点数x
float*类型的浮点数sin
float*类型的浮点数cos | 支持 | -| [sincosl](#sincosl) | 同时计算参数x的正弦值和余弦值,并将结果存储在*sin和*cos,比单独调用sin和cos效率更高 | long double类型的浮点数x
long double*类型的浮点数sin
long double*类型的浮点数cos | 支持 | -| [sinh](#sinh) | 计算参数x的双曲正弦值,返回double类型 | double类型的浮点数x | 支持 | -| [sinhf](#sinhf) | 计算参数x的双曲正弦值,返回float类型 | float类型的浮点数x | 支持 | -| [sinhl](#sinhl) | 计算参数x的双曲正弦值,返回long double类型 | long double类型的浮点数x | 支持 | -| [sqrt](#sqrt) | 计算参数x的平方根,返回类型double | double类型的浮点数x | 支持 | -| [sqrtf](#sqrtf) | 计算参数x的平方根,返回类型float | float类型的浮点数x | 支持 | -| [sqrtl](#sqrtl) | 计算参数x的平方根,返回类型long double | long double类型的浮点数x | 支持 | -| [tan](#tan) | 计算参数x的正切值,参数应为弧度值,返回double类型 | double类型的浮点数x | 支持 | -| [tanf](#tanf) | 计算参数x的正切值,参数应为弧度值,返回float类型 | float类型的浮点数x | 支持 | -| [tanl](#tanl) | 计算参数x的正切值,参数应为弧度值,返回long double类型 | long double类型的浮点数x | 支持 | -| [tanh](#tanh) | 计算参数x的双曲正切值,返回double类型 | double类型的浮点数x | 支持 | -| [tanhf](#tanhf) | 计算参数x的双曲正切值,返回float类型 | float类型的浮点数x | 支持 | -| [tanhl](#tanhl) | 计算参数x的双曲正切值,返回long double类型 | long double类型的浮点数x | 支持 | -| [tgamma](#tgamma) | 计算参数x的伽马函数,返回double类型 | double类型的浮点数x | 支持 | -| [tgammaf](#tgammaf) | 计算参数x的伽马函数,返回float类型 | float类型的浮点数x | 支持 | -| [tgammal](#tgammal) | 计算参数x的伽马函数,返回long double类型 | long double类型的浮点数x | 支持 | -| [trunc](#trunc) | 截取参数x的整数部分,并将整数部分以浮点形式表示 | double类型的浮点数x | 支持 | -| [truncf](#truncf) | 截取参数x的整数部分,并将整数部分以浮点形式表示 | float类型的浮点数x | 支持 | -| [truncl](#truncl) | 截取参数x的整数部分,并将整数部分以浮点形式表示 | long double类型的浮点数x | 支持 | -| [y0](#y0) | 计算参数x的第二类0阶贝塞尔函数 | double类型的浮点数x | 支持 | -| [y0f](#y0f) | 计算参数x的第二类0阶贝塞尔函数 | float类型的浮点数x | 支持 | -| [y1](#y1) | 计算参数x的第二类1阶贝塞尔函数 | double类型的浮点数x | 支持 | -| [y1f](#y1f) | 计算参数x的第二类1阶贝塞尔函数 | float类型的浮点数x | 支持 | -| [yn](#yn) | 计算参数x的第二类n阶贝塞尔函数 | int类型阶数n
double类型的浮点数x | 支持 | -| [ynf](#ynf) | 计算参数x的第二类n阶贝塞尔函数 | int类型阶数n
float类型的浮点数x | 支持 | - -## 设备驱动 - -### register_driver - -在文件系统中注册一个字符设备驱动程序。 - -**参数**: - -1. 要创建的索引节点的路径path。 -2. file_operations结构体指针fops。 -3. 访问权限mode。 -4. 将与inode关联的私有用户数据priv。 - -**输出**: - -- 0:操作成功。 -- 负数值:操作失败。 - -#### unregister_driver - -从文件系统中删除“path”处的字符驱动程序。 - -**参数**: - -1. 要删除的索引节点的路径path。 - -**输出**: - -- 0:操作成功。 -- -EINVAL:无效的path路径。 -- -EEXIST:path中已存在inode。 -- -ENOMEM:内存不足。 - -#### register_blockdriver - -在文件系统中注册一个块设备驱动程序。 - -**参数**: - -1. 要创建的索引节点的路径path。 -2. block_operations结构体指针bops。 -3. 访问权限mode。 -4. 将与inode关联的私有用户数据priv。 - -**输出**: - -- 0:操作成功。 -- -EINVAL:无效的path路径。 -- -EEXIST:path中已存在inode。 -- -ENOMEM:内存不足。 - -#### unregister_blockdriver - -从文件系统中删除“path”处的块设备驱动程序。 - -**参数**: - -1. 要删除的索引节点的路径path。 - -**输出**: - -- 0:操作成功。 -- -EINVAL:无效的path路径。 -- -EEXIST:path中已存在inode。 -- -ENOMEM:内存不足。 - -## Shell模块 - -### SHELLCMD_ENTRY - -向Shell模块静态注册命令。 - -**参数**: - -1. 命令变量名name。 -2. 命令类型cmdType。 -3. 命令关键字cmdKey。 -4. 处理函数的入参最大个数paraNum。 -5. 命令处理函数回调cmdHook。 - -**输出**:无 - -### osCmdReg - -向Shell模块动态注册命令。 - -**参数**: - -1. 命令类型cmdType。 -2. 命令关键字cmdKey。 -3. 处理函数的入参最大个数paraNum。 -4. 命令处理函数回调cmdHook。 - -**输出**: - -- 0:操作成功。 -- OS_ERRNO_SHELL_NOT_INIT:shell模块未初始化。 -- OS_ERRNO_SHELL_CMDREG_PARA_ERROR:无效的输入参数。 -- OS_ERRNO_SHELL_CMDREG_CMD_ERROR:无效的字符串关键字。 -- OS_ERRNO_SHELL_CMDREG_CMD_EXIST:关键字已存在。 -- OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR:内存不足。 diff --git a/docs/zh/uniproton-functions.md b/docs/zh/uniproton-functions.md deleted file mode 100644 index 72713adc..00000000 --- a/docs/zh/uniproton-functions.md +++ /dev/null @@ -1,195 +0,0 @@ -# UniProton功能设计 - - - -- [UniProton功能设计](#uniproton功能设计) - - - [支持任务管理](#支持任务管理) - - - [支持事件管理](#支持事件管理) - - - [支持队列管理](#支持队列管理) - - - [支持硬中断管理](#支持硬中断管理) - - - [支持内存管理](#支持内存管理) - - [FSC内存算法](#fsc内存算法) - - [核心思想](#核心思想) - - [内存申请](#内存申请) - - [内存释放](#内存释放) - - - [支持定时器管理](#支持定时器管理) - - - [支持信号量管理](#支持信号量管理) - - - [支持异常管理](#支持异常管理) - - - [支持CPU占用率统计](#支持cpu占用率统计) - - - [支持STM32F407ZGT6开发板](#支持stm32f407zgt6开发板) - - - [支持OpenAMP混合部署](#支持openamp混合部署) - - - [支持POSIX标准接口](#支持posix标准接口) - - - -## 支持任务管理 - -UniProton是一个单进程支持多线程的操作系统。在UniProton中,一个任务表示一个线程。UniProton中的任务为抢占式调度机制,而非时间片轮转调度方式。高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务挂起或阻塞后才能得到调度。 - -UniProton的任务一共有32个优先级(0-31),最高优先级为0,最低优先级为31。每个优先级可以创建多个任务。 - -UniProton任务管理模块提供任务创建、任务删除、任务挂起、任务恢复、任务延时、锁任务调度、解锁任务调度、当前任务ID获取、任务私有数据获取与设置、查询指定任务正在Pending的信号量ID、查询指定任务状态、上下文信息、任务通用信息、任务优先级设定与获取、调整指定优先级的任务调度顺序、注册及取消任务创建钩子、任务删除钩子、任务切换钩子等功能。UniProton在初始化阶段,默认会创建一个最低优先级的IDLE任务,用户在没有处于运行态的任务时,IDLE任务被运行。 - -## 支持事件管理 - -事件机制可以实现线程之间的通讯。事件通讯只能是事件类型的通讯,无数据传输。 - -UniProton事件作为任务的扩展,实现任务之间的通讯。每个任务支持32种类型事件(32个 bit位,每bit代表一种事件类型)。 - -UniProton提供读取本任务事件和写指定任务事件的功能。读事件时可以同时读取多种事件,也可以只读取一种事件,写事件时也可以同时写一种或多种类型事件。 - -## 支持队列管理 - -队列(Queue),又称消息队列,是线程间实现通信的一种方式,实现了数据的存储和传递功能。根据优先级可以将数据写入到队列头或队列尾,但只能从队列的头处读取数据。 - -UniProton创建队列时,根据用户传入队列长度和消息单元大小来开辟相应的内存空间以供该队列使用。在队列控制块中维护一个头指针Head和一个尾指针Tail来表示当前队列中数据存储情况。头指针Head表示队列中被占用消息的起始地址,尾指针Tail表示队列中空闲消息的起始地址。 - -## 支持硬中断管理 - -硬中断是由硬件触发的会改变系统运行轨迹的一个电平信号,硬中断用于通知CPU某个硬件事件的发生。硬中断一般分为可屏蔽中断和不可屏蔽中断(NMI)两种。 - -硬中断的优先级高于所有任务,其内部也有不同的优先级,当同时有多个硬中断被触发时,最高优先级的硬中断总是优先得到响应。高优先级硬中断是否能打断正在执行的低优先级硬中断(即中断嵌套),视不同芯片平台而异。 - -出于任务延时、软件定时器等需要,OS会在初始化阶段,创建1个Tick硬中断,其实质是一个周期性的硬件定时器。 - -## 支持内存管理 - -内存管理主要工作是动态的划分并管理用户分配好的大片内存区间。当程序某一部分需要使用内存,可以通过操作系统的内存申请函数索取指定大小内存块,一旦使用完毕,通过内存释放函数归还所占用内存,使之可以重复使用。 - -目前UniProton提供了FSC内存算法,该算法优缺点及应用场景如下表所示: - -| 内存算法 | 优点 | 缺点 | 应用场景 | -| :----------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------ | ------------------------------------ | -| 类型私有FSC算法 | 内存控制块信息占用内存较少,支持最小4字节对齐的内存块大小申请;支持相邻内存块的快速分割合并,无内存碎片。 | 内存申请和内存释放的效率较低。 | 能够灵活适应各种产品的场景。 | - -如下简要描述一下FSC内存算法: - -### FSC内存算法 - -#### 核心思想 - -对于申请的内存大小为uwSize,如果用二进制,则表示为0b{0}1xxx,{0}表示1前面可能有0个或多个零。无论1后面xxx为何内容,如果将1变成10,xxx则全部变成0,则总会出现10yyy > 1xxx(此处yyy表示xxx的对应位全部变成0)。 - -我们可以直接得到最左边的1的下标。下标值或者从高位到低位依次为0-31(BitMap),或者从低位到高位依次为0-31(uwSize)。如果32位寄存器从高位到低位的bit位的下标依次为0-31,则0x80004000的最左边1的下标为0。于是我们可以维护一个空闲链表头数组(元素数不超过31),以内存块大小最左边的1的下标做为链表头的数组索引,即将所有最左边的1的下标相同的内存块挂接在同一个空闲链表中。 - -如:索引为2的链表可挂接的空闲块大小为4、5、6、7;索引为N的链表可挂接的空闲块大小为2^N到2^(N+1)-1。 - -![](./figures/FCS.png) - -#### 内存申请 - -当申请uwSize大小的内存时,首先利用汇编指令得到最左边的1的下标,假定为n。为确保空闲链表中的第一个空闲内存块满足uwSize,从索引为n+1开始搜索。若n+1所属空闲链表不为空,则取该链表中的第一个空闲块。若n+1链表为空,则判断n+2链表,依次类推,直到找到非空链表或索引达到31。 - -为避免for循环逐级判断空闲链表是否为空,定义一个32位的BitMap全局变量。若索引n的空闲链表非空,则BitMap的下标为n的位置1,否则清0。BitMap的下标为31的位在初始化时直接置1。于是查找从n+1开始的第一个非空闲链表,可以首先将BitMap复本的0到n位清零,然后获取复本的最左边的1的下标,若不等于31,即为第一个空闲链表非空的数组索引。 - -所有的空闲块都以双向链表的形式,串接在空闲链表中。若从链表中获取的第一个空闲块比较大,即分割出一个uwSize的内存块后,剩下的空间至少可做一次最小分配,则将剩余的空闲块调整到对应的空闲链表中。 - - ![](./figures/MemoryApplication.png) - -内存控制头中记录空闲内存块的大小(包括控制头本身)。内存控制头中有一个复用成员,位于最首部。当内存块空闲时,作为指向后一个空闲内存块的指针;当内存块占用时,存放魔术字,表示该内存块非空闲。为避免魔术字与指针冲突(与地址值相同),高低4位均为0xf。因为已分配的内存块起始地址需按4字节对齐,所以不存在冲突。 - -#### 内存释放 - -当释放内存时,需要将前后相邻的空闲块进行合并。首先,通过判断控制头中的魔术字,确认地址参数(pAddr)的合法性。通过首地址加偏移值的方式,得到后邻的内存块控制头的起始地址。若后邻内存块是空闲的,则将后邻内存块从所属空闲链表中删除,调整当前内存块的大小。 - -为了使内存释放时能迅速找到前邻的内存块控制头,及判断前邻的内存块是否空闲。内存控制头中增加一个成员,标记前邻的内存块是否空闲。可在内存申请时,将后邻的该标记设置为占用态(若空闲内存块被分割成两块,前一块为空闲,将当前内存块的该标记设置为空闲态);在内存释放时,将后邻的该标记设置为空闲态。释放当前内存时,若前邻的内存块标记为使用,则不需要合并前邻的内存块;若前邻的内存块标记为空闲,则需要进行合并。若某个内存块为空闲时,则将其后邻控制块的标记设为到本控制块的距离值。 - - ![](./figures/MemoryRelease.png) - -## 支持定时器管理 - -定时器管理是为满足产品定时业务需要,UniProton提供了软件定时器功能。 - -对于软件定时器,是基于Tick实现,所以定时周期必须为Tick的整数倍,在Tick处理函数中进行软件定时器的超时扫描。 - -目前提供的软件定时器接口,可以完成定时器创建,启动,停止,重启,删除操作。 - -## 支持信号量管理 - -信号量(Semaphore)常用于协助一组互相竞争的任务来访问临界资源,在需要互斥的场合作为临界资源计数使用,根据临界资源使用场景分为核内信号量和核间信号量。 - -信号量对象有一个内部计数器,它支持如下两种操作: - -- 申请(Pend):Pend 操作等待指定的信号量,若其计数器值大于0,则直接减1返回成功。否则任务阻塞,等待其他线程发布该信号量,等待的容忍时间可设定。 - -- 释放(Post):Post操作发布指定的信号量,若无任务等待该信号量,则直接将计数器加1返回。否则唤醒为此信号量挂起的任务列表中的第一个任务(最早阻塞的)。 - -通常一个信号量的计数值用于对应有效的资源数,表示剩余可被占用的互斥资源数。其值的含义如下有两种情况: - -- 为0值:表示没有积累下来的Post操作,且有可能有在此信号量上阻塞的任务。 - -- 为正值:表示有一个或多个Post下来的发布操作。 - -## 支持异常管理 - -UniProton中的异常接管属于维测特性,其主要目的是在系统出现异常后,记录尽可能多的异常现场信息,便于后续问题定位。同时提供异常时的钩子函数,便于用户能够在异常发生时做一些用户化的特殊处理。其主要功能是接管内部异常处理或者外部硬件异常。 - -## 支持CPU占用率统计 - -UniProton中的系统CPU占用率(CPU Percent)是指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPU占用率的有效表示范围为0~10000,其精度为万分比。10000表示系统满负荷运转。 - -UniProton中的线程CPU占用率指单个线程的CPU占用率,用于表示单个线程在一段时间内的闲忙程度。线程CPU占用率的有效表示范围为0~10000,其精度为万分比。10000表示在一段时间内系统一直在运行该线程。单核系统所有线程(包括中断和空闲任务)的CPU之和为10000。 - -UniProton的系统级CPU占用率依赖于Tick模块,通过Tick采样IDLE任务或IDLE软中断计数来实现 - -## 支持STM32F407ZGT6开发板 - -支持开发板主要涉及OS内核外围的启动流程和单板驱动,目录结构如下: - -├─apps # 基于UniProton实时OS编程的demo程序。 - -│ └─hello_world # hello_world示例程序。 - -├─bsp # 提供的板级驱动与OS对接。 - -├─build # 提供编译脚本编译出最终镜像。 - -├─config # 配置选项,供用户调整运行时参数。 - -├─include # UniProton实时部分提供的编程接口API。 - -└─libs # UniProton实时部分的静态库,build目录中的makefile示例已经将头文件和静态库的引用准备好,应用可直接使用。 - -## 支持OpenAMP混合部署 - -OpenAMP是一个开源软件框架,旨在通过非对称多处理器的开源解决方案,来标准化异构嵌入式系统中操作环境之间的交互。OpenAMP包括如下四大组件: - -1. remoteproc:管理从核的生命周期,管理共享内存、通信使用的buffer、vring等资源,初始化rpmsg和virtio。 -2. rpmsg:实现多核通信的通道,基于virtio实现。 -3. virtio:通过一套虚拟IO实现主从核的驱动程序通信,是一种半虚拟化技术。 -4. libmetal:屏蔽操作系统实现细节,提供通用用户API访问设备,处理设备中断、内存请求。 - -## 支持POSIX标准接口 - -[UniProton支持posix标准接口](./uniproton-apis.md) - -## 支持设备驱动 - -UniProton的驱动结构、风格与linux类似,将驱动设备文件化,即VFS系统,通过驱动注册接口,将驱动注册到文件系统中,应用层只需要通过标准系统调用,即可调用底层驱动。整个驱动框架代码适配自开源RTOS系统Nuttx的驱动模块,因此接口调用也与Nuttx基本一致。struct file_operations结构体保存设备文件操作的方法,定义在fs.h头文件中,通过register_driver接口将驱动设备挂到对应的struct inode节点中,struct inode描述了每个设备节点的位置和数据。当系统调用操作设备文件时,根据对应文件的inode就能索引到对应的函数。接口详细信息可以查看[UniProton接口说明](./uniproton-apis.md)。 - -## 支持Shell命令行 - -UniProton提供shell命令行,它能够以命令行交互的方式访问操作系统的功能或服务:它接受并解析用户输入的命令,并处理操作系统的输出结果。UniProton的shell模块代码适配自开源ROTS系统LiteOS的shell模块。因此与LiteOS一致,用户可以新增定制的命令,新增命令需重新编译烧录后才能执行。当前UniProton只支持了help命令,其他命令将在后续的版本中进行完善。Shell模块为用户提供下面几个接口。 - -| 接口名 | 描述 | -| :---: | :--: | -| SHELLCMD_ENTRY | 静态注册命令 | -| osCmdReg | 动态注册命令 | - -通常静态注册命令方式一般用于注册系统常用命令,动态注册命令方式一般用于注册用户命令。静态注册命令有5个入参,动态注册命令有4个入参。下面除去第一个入参是静态注册独有的,剩余的四个入参两个注册命令是一致的。接口详细信息可以查看[UniProton接口说明](./uniproton-apis.md) -- Gitee From c34f6e6ea037ddec062fc4e83e54102259b69f38 Mon Sep 17 00:00:00 2001 From: chopupu Date: Fri, 5 Sep 2025 15:12:56 +0800 Subject: [PATCH 3/3] doc: add user manual Add user manual in doc folder Signed-off-by: chopupu --- .DS_Store | Bin 0 -> 6148 bytes doc/en/_toc.yaml | 10 + doc/en/figures/FCS.png | Bin 0 -> 22115 bytes doc/en/figures/MemoryApplication.png | Bin 0 -> 6386 bytes doc/en/figures/MemoryRelease.png | Bin 0 -> 10618 bytes doc/en/figures/pend_semaphore.png | Bin 0 -> 32691 bytes doc/en/figures/post_semaphore.png | Bin 0 -> 26707 bytes doc/en/overview.md | 11 + doc/en/uniproton_apis.md | 3 + doc/en/uniproton_functions.md | 151 + doc/zh/_toc.yaml | 10 + doc/zh/figures/FCS.png | Bin 0 -> 22115 bytes doc/zh/figures/MemoryApplication.png | Bin 0 -> 6386 bytes doc/zh/figures/MemoryRelease.png | Bin 0 -> 10618 bytes doc/zh/figures/pend_semaphore.png | Bin 0 -> 32691 bytes doc/zh/figures/post_semaphore.png | Bin 0 -> 26707 bytes doc/zh/overview.md | 11 + doc/zh/uniproton-apis.md | 6311 ++++++++++++++++++++++++++ doc/zh/uniproton-functions.md | 195 + 19 files changed, 6702 insertions(+) create mode 100644 .DS_Store create mode 100644 doc/en/_toc.yaml create mode 100644 doc/en/figures/FCS.png create mode 100644 doc/en/figures/MemoryApplication.png create mode 100644 doc/en/figures/MemoryRelease.png create mode 100644 doc/en/figures/pend_semaphore.png create mode 100644 doc/en/figures/post_semaphore.png create mode 100644 doc/en/overview.md create mode 100644 doc/en/uniproton_apis.md create mode 100644 doc/en/uniproton_functions.md create mode 100644 doc/zh/_toc.yaml create mode 100644 doc/zh/figures/FCS.png create mode 100644 doc/zh/figures/MemoryApplication.png create mode 100644 doc/zh/figures/MemoryRelease.png create mode 100644 doc/zh/figures/pend_semaphore.png create mode 100644 doc/zh/figures/post_semaphore.png create mode 100644 doc/zh/overview.md create mode 100644 doc/zh/uniproton-apis.md create mode 100644 doc/zh/uniproton-functions.md diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..270839114f27cd8c0b653060853a157e6ac773e5 GIT binary patch literal 6148 zcmeHK!AiqG5Z!H~O(;SR3Oz1(Em&(+ikA@U4;aydN==%g!I&*gY7eE5v;L4@;`cbS zyDdr;Jc;NG%)H6$Ov1i|oeX1)`;&N=F_$rBgCbTOFrNsnqpnEBM5=%s?=eUtDN}Hn zwUSJMU&#QzyDE#BWP><=|Nc~n<3Qm zzT241+K2m1(eCcen_|{&x0<4J(3#I2duw~==(K;IK4kJq6U*_tL)p-gWKYMgYL& z|33IQOJI#K=ou_E!U_o2rGUDWn-PQSa)=9)=NT+D>T<@-@WIWKxtUP7dOF-+sC33X zjbw=dV&EeKIQxOP*#A$yp8r)68DfAK_?rxHs~7Zq*qiCCE4##AD?o2RQ82I6xGVuj hwPMJ{R@?wp0&#&3pl7hu2oVta5l}RcAqIYwfj5T literal 0 HcmV?d00001 diff --git a/doc/en/_toc.yaml b/doc/en/_toc.yaml new file mode 100644 index 00000000..02572774 --- /dev/null +++ b/doc/en/_toc.yaml @@ -0,0 +1,10 @@ +label: UniProton User Guide +isManual: true +description: UniProton is an OS tailored for embedded environments. It offers task and memory management, interrupt handling, and advanced debugging features. +sections: + - label: Overview + href: ./overview.md + - label: UniProton Feature Design + href: ./uniproton_functions.md + - label: UniProton Interfaces + href: ./uniproton_apis.md diff --git a/doc/en/figures/FCS.png b/doc/en/figures/FCS.png new file mode 100644 index 0000000000000000000000000000000000000000..afb47c557755c10a3f0b196b7080b16a0f86ab6a GIT binary patch literal 22115 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 literal 0 HcmV?d00001 diff --git a/doc/en/figures/MemoryRelease.png b/doc/en/figures/MemoryRelease.png new file mode 100644 index 0000000000000000000000000000000000000000..f91c89bb02311f104949e2af42cddc4a3faaaca3 GIT binary patch literal 10618 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 b55LZ8wvv0OYDU-yz(0L$W374(=lK5xTFYw6 literal 0 HcmV?d00001 diff --git a/doc/en/figures/post_semaphore.png b/doc/en/figures/post_semaphore.png new file mode 100644 index 0000000000000000000000000000000000000000..fa08d76dafd335b60838dda08db61ccadd8c6b8d GIT binary patch literal 26707 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

!lB6}pF< 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 xr5d<>eo. diff --git a/doc/en/uniproton_apis.md b/doc/en/uniproton_apis.md new file mode 100644 index 00000000..87ed2109 --- /dev/null +++ b/doc/en/uniproton_apis.md @@ -0,0 +1,3 @@ +# UniProton APIs + +This document is currently not available in English. diff --git a/doc/en/uniproton_functions.md b/doc/en/uniproton_functions.md new file mode 100644 index 00000000..730c0ad0 --- /dev/null +++ b/doc/en/uniproton_functions.md @@ -0,0 +1,151 @@ +# UniProton Feature Design + +## Task Management + +UniProton is a single-process multi-thread operating system (OS). In UniProton, a task represents a thread. Tasks in UniProton are scheduled in preemption mode instead of time slice rotation scheduling. High-priority tasks can interrupt low-priority tasks. Low-priority tasks can be scheduled only after high-priority tasks are suspended or blocked. + +A total of 32 priorities are defined, with priority 0 being the highest and 31 being the lowest. Multiple tasks can be created in a priority. + +The task management module of UniProton provides the following functions: Creates, deletes, suspends, resumes, and delays tasks; Locks and unlocks task scheduling; Obtains the current task ID; Obtains and sets task private data; Query the pending semaphore ID of a specified task; Query the status, context, and general information of a specified task; Obtains and sets task priorities; Adjusts the task scheduling order of a specified priority; Register and unregister hooks for task creation, deletion, and switching. During initialization, UniProton creates an idle task with the lowest priority by default. When no task is in the running status, the idle task is executed. + +## Event Management + +The event mechanism enables communication between threads. Event communication can only be event notifications and no data is transmitted. + +As an extension of tasks, events allow tasks to communicate with each other. Each task supports 32 event types, each represented by a bit of a 32-bit value. + +UniProton can read current task events and write specified task events. Multiple event types can be read or written at one time. + +## Queue Management + +A queue, also called message queue, is a method commonly used for inter-thread communication to store and transfer data. Data can be written to the head or tail of a queue based on the priority, but can be read only from the head of a queue. + +When creating a queue, UniProton allocates memory space for the queue based on the queue length and message unit size input by the user. The queue control block contains **Head** and **Tail** pointers, which indicate the storage status of data in a queue. **Head** indicates the start position of occupied message nodes in the queue. **Tail** indicates the end position of the occupied message nodes in the queue. + +## Hard Interrupt Management + +A hardware interrupt is a level signal that is triggered by hardware and affects system running. A hardware interrupt is used to notify the CPU of a hardware event. Hardware interrupts include maskable interrupts and non-maskable interrupts (NMIs). + +Hardware interrupts have different internal priorities, but they all have a higher priority than other tasks. When multiple hardware interrupts are triggered at the same time, the hardware interrupt with the highest priority is always responded first. Whether a high-priority hardware interrupt can interrupt a low-priority hardware interrupt that is being executed (that is, nested interrupts) depends on the chip platform. + +The OS creates a tick hardware interrupt during initialization for task delay and software timer purposes. The tick is essentially a hardware timer. + +## Memory Management + +Memory management is to dynamically divide and manage large memory areas allocated by users. When a section of a program needs to use the memory, the program calls the memory application function of the OS to obtain the memory block of a specified size. After using the memory, the program calls the memory release function to release the occupied memory. + +UniProton provides the FSC memory algorithm. The following table lists the advantages, disadvantages, and application scenarios of FSC. + +| Algorithm | Advantages | Disadvantages | Application Scenarios | +| :----------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------ | ------------------------------------ | +| Private FSC algorithm| The memory control block information occupies a small amount of memory. The minimum 4-byte-aligned memory block size can be applied for. Adjacent memory blocks can be quickly split and merged without creating memory fragmentation.| The efficiency of memory application and release is low.| It can flexibly adapt to various product scenarios.| + +The FSC memory algorithm is described as follows: + +### FSC Memory Algorithm + +#### Core Idea + +The size of the requested memory is **uwSize**. If the size is in binary, it is expressed as **0b{0}1xxx**. **{0}** indicates that there may be one or more zeros before **1**. Regardless of the content of following **1** (**xxx**), if **1** is changed to **10** and **xxx** is changed to **0**, **10yyy** is always greater than **1xxx** (**yyy** indicates that the corresponding bits of **xxx** are changed to **0**). + +The subscript of the leftmost 1 can be directly obtained. The subscript values are 0 to 31 from the most significant bit to the least significant bit (BitMap), or 0 to 31 from the least significant bit to the most significant bit (uwSize). If the subscripts of the bits of the 32-bit register are 0 to 31 from the most significant bit to the least significant bit, the subscript of the leftmost 1 of 0x80004000 is 0. Therefore, we can maintain an idle linked list header array (the number of elements does not exceed 31). The subscript of the leftmost 1 of the memory block size is used as the index of the linked list header array. That is, all memory blocks with the same subscript of the leftmost 1 are mounted to the same idle linked list. + +For example, the sizes of idle blocks that can be mounted to the linked list whose index is 2 are 4, 5, 6, and 7, and the sizes of idle blocks that can be mounted to the linked list whose index is N are 2^N to 2^(N+1)-1. + +![](./figures/FCS.png) + +#### Memory Application + +When applying for the memory of uwSize, use assembly instructions to obtain the subscript of the leftmost 1 first. Assume that the subscript is **n**. To ensure that the first idle memory block in the idle linked list meets the uwSize requirement, the search starts from the index n+1. If the idle linked list of index n+1 is not empty, the first idle block in the linked list is used. If the linked list of n+1 is empty, the linked list of n+2 is checked, and so on, until a non-empty linked list is found or the index reaches 31. + +A 32-bit BitMap global variable is defined to prevent the for loop from checking whether the idle linked list is empty recursively. If the idle linked list of n is not empty, the value whose subscript is n of BitMap is set to 1. Otherwise, the value is set to 0. The bit whose subscript is 31 of the BitMap is directly set to 1 during initialization. Therefore, the first non-idle linked list is searched from linked list of n+1. Bits 0 to n of the BitMap copy can be cleared first, and then a subscript of the leftmost 1 of the copy is obtained. If the subscript is not equal to 31, the subscript is the array index of the first non-empty idle linked list. + +All idle blocks are connected in series in the form of a bidirectional idle linked list. If the first idle block obtained from the linked list is large, that is, after a usSize memory block is split, the remaining space can be allocated at least once, The remaining idle blocks are added to the corresponding idle linked list. + +![](./figures/MemoryApplication.png) + +The memory control header records the size of the idle memory block (including the control header itself). The memory control header contains a reused member at the beginning. When a memory block is idle, it is used as a pointer to the next idle memory block. When a memory block is occupied, it stores a magic number, indicating that the memory block is not idle. To prevent the magic number from conflicting with the pointer (same as the address value), the upper and lower four bits of the magic number are 0xf. The start addresses of the allocated memory blocks are 4-byte-aligned. Therefore, no conflict occurs. + +#### Memory Release + +When the memory is released, adjacent idle blocks are combined. First, the validity of the address parameter (**pAddr**) is determined by checking the magic number in the control header. The start address of the control header of the next memory block is obtained by adding the start address to the offset value. If the next memory block is idle, the next memory block is deleted from the idle linked list to which it belongs, and the size of the current memory block is adjusted. + +To quickly find the control header of the previous memory block and determine whether the previous memory block is idle during memory release, a member is added to the memory control header to mark whether the previous memory block is idle. When the memory is applied for, the flag of the next memory block can be set to the occupied state (if the idle memory block is divided into two, and the previous memory block is idle, the flag of the current memory block is set to the idle state). When the memory is released, the flag of the next memory block is set to the idle state. When the current memory is released, if the previous memory block is marked as occupied, the previous memory block does not need to be merged; if the previous memory block is marked as idle, the previous memory block needs to be merged. If a memory block is idle, the flag of the next control block is set to the distance to the current control block. + + ![](./figures/MemoryRelease.png) + +## Timer Management + +UniProton provides the software timer function to meet the requirements of timing services. + +Software timers are based on the tick interrupts. Therefore, the period of a timer must be an integral multiple of the tick. The timeout scanning of the software timer is performed in the tick handler function. + +Currently, the software timer interface can be used to create, start, stop, restart, and delete timers. + +## Semaphore Management + +A semaphore is typically used to coordinate a group of competing tasks to access to critical resources. When a mutex is required, the semaphore is used as a critical resource counter. Semaphores include intra-core semaphores and inter-core semaphores. + +The semaphore object has an internal counter that supports the following operations: + +- Pend: The Pend operation waits for the specified semaphore. If the counter value is greater than 0, it is decreased by 1 and a success message is returned. If the counter value of the semaphore is 0, the requesting task is blocked until another task releases the semaphore. The amount of time the task will wait for the semaphore is user configurable. + +- Post: The Post operation releases the specified semaphore. If no task is waiting for the semaphore, the counter is incremented by 1 and returned. Otherwise, the first task (the earliest blocked task) in the list of tasks pending for this semaphore is woken up. + +The counter value of a semaphore corresponds to the number of available resources. It means mutually exclusive resources remained that could be occupied. The counter value can be: + +- 0, indicating that there is no accumulated post operation, and there may be a task blocked on the semaphore. + +- A positive value, indicating that there are one or more post release operations. + +## Exception Management + +Exception takeover of UniProton is a maintenance and test feature that records as much information as possible when an exception occurs to facilitate subsequent fault locating. In addition, the exception hook function is provided so that users can perform special handling when an exception occurs. The exception takeover feature handles internal exceptions and external hardware exceptions. + +## CPU Usage Statistics + +The system CPU usage (CPU percentage, CPUP) in UniProton refers to the CPU usage of the system within a period of time. It reflects the CPU load and the system running status (idle or busy) in the given period of time. The valid range of the system CPUP is 0 to 10000, in basis points. 10000 indicates that the system is fully loaded. + +The thread CPUP refers to the CPU usage of a single thread. It reflects the thread status, busy or idle, in a period of time. The valid range of the thread CPUP is 0 to 10000, in basis points. 10000 indicates that the process is being executed for a period of time. The total CPUPs of all threads (including interrupts and idle tasks) in a single-core system is 10000. + +The system-level CPUP statistics of UniProton depends on the tick module, which is implemented by tick sampling idle tasks or idle software interrupt counter. + +## STM32F407ZGT6 Development Board Support + +The kernel peripheral startup process and board driver of UniProton supports the STM32F407ZGT6 development board. The directory structure is as follows: + +├─apps # Demo based on the real-time OS of UniProton +│ └─hello_world # hello_world example program +├─bsp # Board-level driver to interconnect with the OS +├─build # Build script to build the final image +├─config # Configuration items to adjust running parameters +├─include # APIs provided by the real-time OS of UniProton +└─libs # Static libraries of the real-time OS of UniProton. The makefile example in the build directory has prepared the reference of the header file and static libraries. + +## OpenAMP Hybrid Deployment + +OpenAMP is an open source software framework designed to standardize the interaction between environments in heterogeneous embedded systems through open source solutions based on asymmetric multi-processing. OpenAMP consists of the following components: + +1. Remoteproc manages the life cycle of the slave core, shared memory, and resources such as buffer and vring used for communication, and initializes RPMsg and virtio. +2. RPMsg enables multi-core communication based on virtio. +3. Virtio, which is a paravirtualization technology, uses a set of virtual I/Os to implement driver communication between the master and slave cores. +4. libmetal shields OS implementation details, provides common user APIs to access devices, and handles device interrupts and memory requests. + +## POSIX Standard APIs + +[UniProton supports POSIX standard APIs](./uniproton_apis.md). + +## Device Drivers + +UniProton's driver architecture follows a Linux-like approach, treating devices as files through its Virtual File System (VFS). Drivers register with the file system via registration interfaces, enabling applications to access hardware through standard system calls. Adapted from Nuttx's open-source RTOS driver module, the framework maintains Nuttx-compatible interfaces. The file_operations structure (defined in fs.h) stores device operation methods, while register_driver associates devices with their inode structures that describe node locations and data. System calls reference these inodes to locate corresponding driver functions. For interface specifications, see [UniProton APIs](./uniproton_apis.md). + +## Shell Commands + +UniProton features a shell interface for command-line interaction with OS services, parsing user input and processing system outputs. Adapted from LiteOS's shell module, it supports custom command creation (requiring recompilation). Current implementation includes only the help command, with more commands planned for future releases. + +| Interface | Description | +| :---: | :--: | +| SHELLCMD_ENTRY | Static command registration | +| osCmdReg | Dynamic command registration | + +Static registration (5 parameters) typically handles system commands, while dynamic registration (4 parameters) manages user commands. Both share four common parameters after the static method's unique first parameter. Details in [UniProton APIs](./uniproton_apis.md). diff --git a/doc/zh/_toc.yaml b/doc/zh/_toc.yaml new file mode 100644 index 00000000..4172c8f5 --- /dev/null +++ b/doc/zh/_toc.yaml @@ -0,0 +1,10 @@ +label: UniProton用户指南 +isManual: true +description: UniProton是面向嵌入式场景的操作系统,支持任务和内存管理、中断处理,提供强大调试能力 +sections: + - label: 概述 + href: ./overview.md + - label: UniProton功能设计 + href: ./uniproton-functions.md + - label: UniProton接口说明 + href: ./uniproton-apis.md diff --git a/doc/zh/figures/FCS.png b/doc/zh/figures/FCS.png new file mode 100644 index 0000000000000000000000000000000000000000..afb47c557755c10a3f0b196b7080b16a0f86ab6a GIT binary patch literal 22115 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 literal 0 HcmV?d00001 diff --git a/doc/zh/figures/MemoryRelease.png b/doc/zh/figures/MemoryRelease.png new file mode 100644 index 0000000000000000000000000000000000000000..f91c89bb02311f104949e2af42cddc4a3faaaca3 GIT binary patch literal 10618 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 b55LZ8wvv0OYDU-yz(0L$W374(=lK5xTFYw6 literal 0 HcmV?d00001 diff --git a/doc/zh/figures/post_semaphore.png b/doc/zh/figures/post_semaphore.png new file mode 100644 index 0000000000000000000000000000000000000000..fa08d76dafd335b60838dda08db61ccadd8c6b8d GIT binary patch literal 26707 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

!lB6}pF< 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 xr5d<>eodouble类型的浮点数x | 支持 | +| [atan2f](#atan2f) | 计算参数y除以x的反正切值,使用两个参数的符号确定返回值的象限 | float类型的浮点数y
float类型的浮点数x | 支持 | +| [atan2l](#atan2l) | 计算参数y除以x的反正切值,使用两个参数的符号确定返回值的象限 | long double类型的浮点数y
long double类型的浮点数x | 支持 | +| [atanh](#atanh) | 计算参数x的反双曲正切值,返回类型double | double类型的浮点数x | 支持 | +| [atanhf](#atanhf) | 计算参数x的反双曲正切值,返回类型float | float类型的浮点数x | 支持 | +| [atanhl](#atanhl) | 计算参数x的反双曲正切值,返回类型long double | long double类型的浮点数x | 支持 | +| [cbrt](#cbrt) | 计算参数x的立方根,返回类型double | double类型的浮点数x | 支持 | +| [cbrtf](#cbrtf) | 计算参数x的立方根,返回类型float | float类型的浮点数x | 支持 | +| [cbrtl](#cbrtl) | 计算参数x的立方根,返回类型long double | long double类型的浮点数x | 支持 | +| [ceil](#ceil) | 计算不小于参数x的最小整数值,返回类型double | duoble类型的浮点数x | 支持 | +| [ceilf](#ceilf) | 计算不小于参数x的最小整数值,返回类型float | float类型的浮点数x | 支持 | +| [ceill](#ceill) | 计算不小于参数x的最小整数值,返回类型long double | long duoble类型的浮点数x | 支持 | +| [copysign](#copysign) | 生成一个值,该值具有参数x的大小和参数y的符号 | duoble类型的浮点数x
double类型的浮点数y | 支持 | +| [copysignf](#copysignf) | 生成一个值,该值具有参数x的大小和参数y的符号 | float类型的浮点数x
float类型的浮点数y | 支持 | +| [copysignl](#copysignl) | 生成一个值,该值具有参数x的大小和参数y的符号 | long duoble类型的浮点数x
long double类型的浮点数y | 支持 | +| [cos](#cos) | 计算参数x的余弦值,参数应为弧度值,返回类型double | duoble类型的浮点数x | 支持 | +| [cosf](#cosf) | 计算参数x的余弦值,参数应为弧度值,返回类型float | float类型的浮点数x | 支持 | +| [cosl](#cosl) | 计算参数x的余弦值,参数应为弧度值,返回类型long double | long double类型的浮点数x | 支持 | +| [cosh](#cosh) | 计算参数x的双曲余弦值,返回类型double | double类型的浮点数x | 支持 | +| [coshf](#coshf) | 计算参数x的双曲余弦值,返回类型float | float类型的浮点数x | 支持 | +| [coshl](#coshl) | 计算参数x的双曲余弦值,返回类型long double | long double类型的浮点数x | 支持 | +| [erf](#erf) | 计算参数x的高斯误差函数的值 | double类型的浮点数x | 支持 | +| [erff](#erff) | 计算参数x的高斯误差函数的值 | float类型的浮点数x | 支持 | +| [erfl](#erfl) | 计算参数x的高斯误差函数的值 | long double类型的浮点数x | 支持 | +| [erfc](#erfc) | 计算参数x的高斯误差函数的值 | double类型的浮点数x | 支持 | +| [erfcf](#erfcf) | 计算参数x的互补误差函数的值 | float类型的浮点数x | 支持 | +| [erfcl](#erfcl) | 计算参数x的互补误差函数的值 | long double类型的浮点数x | 支持 | +| [exp](#exp) | 以e为基数的指数,即$e^x$的值,返回类型double | double类型的浮点数x | 支持 | +| [expf](#expf) | 以e为基数的指数,即$e^x$的值,返回类型float | float类型的浮点数x | 支持 | +| [expl](#expl) | 以e为基数的指数,即$e^x$的值,返回类型long double | long double类型的浮点数x | 支持 | +| [exp10](#exp10) | 以10为基数的指数,即$10^x$的值,返回类型double | double类型的浮点数x | 支持 | +| [exp10f](#exp10f) | 以10为基数的指数,即$10^x$的值,返回类型float | float类型的浮点数x | 支持 | +| [exp10l](#exp10l) | 以10为基数的指数,即$10^x$的值,返回类型long double | long double类型的浮点数x | 支持 | +| [exp2](#exp2) | 以2为基数的指数函数,返回类型double | double类型的浮点数x | 支持 | +| [exp2f](#exp2f) | 以2为基数的指数函数,返回类型float | float类型的浮点数x | 支持 | +| [exp2l](#exp2l) | 以2为基数的指数函数,返回类型long double | long double类型的浮点数x | 支持 | +| [expm1](#expm1) | 计算$e^x - 1$的值。如果参数x是个小值,expm1(x)函数的值比表达式$e^x - 1$更准确 | double类型的浮点数x | 支持 | +| [expm1f](#expm1f) | 计算$e^x - 1$的值。如果参数x是个小值,expm1(x)函数的值比表达式$e^x - 1$更准确 | float类型的浮点数x | 支持 | +| [expm1l](#expm1l) | 计算$e^x - 1$的值。如果参数x是个小值,expm1(x)函数的值比表达式$e^x - 1$更准确 | long double类型的浮点数x | 支持 | +| [fabs](#fabs) | 计算参数x的绝对值,返回类型double | double类型的浮点数x | 支持 | +| [fabsf](#fabsf) | 计算参数x的绝对值,返回类型float | float类型的浮点数x | 支持 | +| [fabsl](#fabsl) | 计算参数x的绝对值,返回类型long double | long double类型的浮点数x | 支持 | +| [fdim](#fdim) | 计算参数x和参数y之间的正差值 | double类型的浮点数x
double类型的浮点数y | 支持 | +| [fdimf](#fdimf) | 计算参数x和参数y之间的正差值 | float类型的浮点数x
float类型的浮点数y | 支持 | +| [fdiml](#fdiml) | 计算参数x和参数y之间的正差值 | long double类型的浮点数x
long double类型的浮点数y | 支持 | +| [finite](#finite) | 如果参数x既不是无限值也不是NaN,则返回一个非零值,否则返回0 | double类型的浮点数x | 支持 | +| [finitef](#finitef) | 如果参数x既不是无限值也不是NaN,则返回一个非零值,否则返回0 | float类型的浮点数x| 支持 | +| [floor](#floor) | 计算不大于参数x到最大整数值,返回类型double | double类型的浮点数x | 支持 | +| [floorf](#floorf) | 计算不大于参数x到最大整数值,返回类型float | float类型的浮点数x | 支持 | +| [floorl](#floorl) | 计算不大于参数x到最大整数值,返回类型long double | long double类型的浮点数x | 支持 | +| [fma](#fma) | 计算表达式$(x * y) + z$的值,返回double类型 | double类型的浮点数x
double类型的浮点数y
double类型的浮点数z | 支持 | +| [fmaf](#fmaf) | 计算表达式$(x * y) + z$的值,返回float类型 | float类型的浮点数x
float类型的浮点数y
float类型的浮点数z | 支持 | +| [fmal](#fmal) | 计算表达式$(x * y) + z$的值,返回long double类型 | long double类型的浮点数x
long double类型的浮点数y
long double类型的浮点数z | 支持 | +| [fmax](#fmax) | 确定其参数的最大数值。如果一个参数是非数值(NaN),另一个参数是数值,fmax函数将选择数值 | double类型的浮点数x
double类型的浮点数y | 支持 | +| [fmaxf](#fmaxf) | 确定其参数的最大数值。如果一个参数是非数值(NaN),另一个参数是数值,fmax函数将选择数值 | float类型的浮点数x
float类型的浮点数y | 支持 | +| [fmaxl](#fmaxl) | 确定其参数的最大数值。如果一个参数是非数值(NaN),另一个参数是数值,fmax函数将选择数值 | long double类型的浮点数x
long double类型的浮点数y | 支持 | +| [fmin](#fmin) | 返回其参数的最小数值。非数值NaN参数视为缺失数据。如果一个参数是非数值,另一个参数是数值,fmin函数将选择数值 | double类型的浮点数x
double类型的浮点数y | 支持 | +| [fminf](#fminf) | 返回其参数的最小数值。非数值NaN参数视为缺失数据。如果一个参数是非数值,另一个参数是数值,fmin函数将选择数值 | float类型的浮点数x
float类型的浮点数y | 支持 | +| [fminl](#fminl) | 返回其参数的最小数值。非数值NaN参数视为缺失数据。如果一个参数是非数值,另一个参数是数值,fmin函数将选择数值 | long double类型的浮点数x
long double类型的浮点数y | 支持 | +| [fmod](#fmod) | 计算表达式x/y的浮点余数,返回double类型 | double类型的浮点数x
double类型的浮点数y | 支持 | +| [fmodf](#fmodf) | 计算表达式x/y的浮点余数,返回float类型 | float类型的浮点数x
float类型的浮点数y | 支持 | +| [fmodl](#fmodl) | 计算表达式x/y的浮点余数,返回long double类型 | long double类型的浮点数x
long double类型的浮点数y | 支持 | +| [frexp](#frexp) | 将浮点数分解为规格化小数和2的整数幂,并将整数存入参数exp指向的对象中 | double类型的浮点数x
int *类型的浮点数y | 支持 | +| [frexpf](#frexpf) | 将浮点数分解为规格化小数和2的整数幂,并将整数存入参数exp指向的对象中 | float类型的浮点数x
int *类型的浮点数y | 支持 | +| [frexpl](#frexpl) | 将浮点数分解为规格化小数和2的整数幂,并将整数存入参数exp指向的对象中 | long double类型的浮点数x
int *类型的浮点数y | 支持 | +| [hypot](#hypot) | 计算表达式$(x^2 + y^2)^{1/2}$的值 | double类型的浮点数x
double类型的浮点数y | 支持 | +| [hypotf](#hypotf) | 计算表达式$(x^2 + y^2)^{1/2}$的值 | float类型的浮点数x
float类型的浮点数y | 支持 | +| [hypotl](#hypotl) | 计算表达式$(x^2 + y^2)^{1/2}$的值 | long double类型的浮点数x
long double类型的浮点数y | 支持 | +| [ilogb](#ilogb) | 以FLT_RADIX作为对数的底数,返回double类型x的对数的整数部分 | double类型的浮点数x | 支持 | +| [ilogbf](#ilogbf) | 以FLT_RADIX作为对数的底数,返回float类型x的对数的整数部分 | float类型的浮点数x | 支持 | +| [ilogbl](#ilogbl) | 以FLT_RADIX作为对数的底数,返回long double类型x的对数的整数部分 | long double类型的浮点数x | 支持 | +| [j0](#j0) | 计算参数x的第一类0阶贝塞尔函数 | double类型浮点数x | 支持 | +| [j0f](#j0f) | 计算参数x的第一类0阶贝塞尔函数 | float类型浮点数x | 支持 | +| [j1](#j1) | 计算参数x的第一类1阶贝塞尔函数 | double类型浮点数x | 支持 | +| [j1f](#j1f) | 计算参数x的第一类1阶贝塞尔函数 | float类型浮点数x | 支持 | +| [jn](#jn) | 计算参数x的第一类n阶贝塞尔函数 | int类型阶数
double类型浮点数x | 支持 | +| [jnf](#jnf) | 计算参数x的第一类n阶贝塞尔函数 | int类型阶数
float类型浮点数x | 支持 | +| [ldexp](#ldexp) | 计算参数x与2的exp次幂的乘积,即返回$x * 2^{exp}$的double类型值。 | double类型的浮点数x
int类型的指数exp | 支持 | +| [ldexpf](#ldexpf) | 计算参数x与2的exp次幂的乘积,即返回$x * 2^{exp}$的float类型值。 | float类型的浮点数x
int类型的指数exp | 支持 | +| [ldexpl](#ldexpl) | 计算参数x与2的exp次幂的乘积,即返回$x * 2^{exp}$的long double类型值。 | long double类型的浮点数x
int类型的指数exp | 支持 | +| [lgamma](#lgamma) | 计算参数x伽玛绝对值的自然对数,返回double类型 | double类型的浮点数x | 支持 | +| [lgammaf](#lgammaf) | 计算参数x伽玛绝对值的自然对数,返回float类型 | float类型的浮点数x | 支持 | +| [lgammal](#lgammal) | 计算参数x伽玛绝对值的自然对数,返回long double类型 | long double类型的浮点数x | 支持 | +| [lgamma_r](#lgamma_r) | 计算参数x伽玛绝对值的自然对数,与lgamma不同在于是线程安全的 | double类型的浮点数x
int *类型符号参数 | 支持 | +| [lgamma_r](#lgamma_r) | 计算参数x伽玛绝对值的自然对数,与lgamma不同在于是线程安全的 | float类型的浮点数x
int *类型符号参数 | 支持 | +| [llrint](#llrint) | 根据当前舍入模式,将参数舍入为long long int类型的最接近整数值 | double类型的浮点数x | 支持 | +| [llrintf](#llrintf) | 根据当前舍入模式,将参数舍入为long long int类型的最接近整数值 | float类型的浮点数x | 支持 | +| [llrintl](#llrintl) | 根据当前舍入模式,将参数舍入为long long int类型的最接近整数值 | long double类型的浮点数x | 支持 | +| [llround](#llround) | 将double类型x舍入为浮点形式表示的long long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | double类型的浮点数x | 支持 | +| [llroundf](#llroundf) | 将float类型x舍入为浮点形式表示的long long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | float类型的浮点数x | 支持 | +| [llroundl](#llroundl) | 将long double类型x舍入为浮点形式表示的long long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | long double类型的浮点数x | 支持 | +| [log](#log) | double类型x的自然对数函数 | double类型的浮点数x | 支持 | +| [logf](#logf) | float类型x的自然对数函数 | float类型的浮点数x | 支持 | +| [logl](#logl) | long double类型x的自然对数函数 | long double类型的浮点数x | 支持 | +| [log10](#log10) | double类型x以10为底数的对数函数 | double类型的浮点数x | 支持 | +| [log10f](#log10f) | float类型x以10为底数的对数函数 | float类型的浮点数x | 支持 | +| [log10l](#log10l) | long double类型x以10为底数的对数函数 | long double类型的浮点数x | 支持 | +| [log1p](#log1p) | 以e为底数的对数函数,计算$log_e(1 + x)$的值。如果参数x是个小值,表达式log1p(x)比表达式log(1 + x)更准确 | double类型的浮点数x | 支持 | +| [log1pf](#log1pf) | 以e为底数的对数函数,计算$log_e(1 + x)$的值。如果参数x是个小值,表达式log1p(x)比表达式log(1 + x)更准确 | float类型的浮点数x | 支持 | +| [log1pl](#log1pl) | 以e为底数的对数函数,计算$log_e(1 + x)$的值。如果参数x是个小值,表达式log1p(x)比表达式log(1 + x)更准确 | long double类型的浮点数x | 支持 | +| [log2](#log2) | double类型x以2为底数的对数函数 | double类型的浮点数x | 支持 | +| [log2f](#log2f) | float类型x以2为底数的对数函数 | flaot类型的浮点数x | 支持 | +| [log2l](#log2l) | long double类型x以2为底数的对数函数 | long double类型的浮点数x | 支持 | +| [logb](#logb) | double类型x以FLT_RADIX为的底数到对数函数 | double类型的浮点数x | 支持 | +| [logbf](#logbf) | float类型x以FLT_RADIX为的底数到对数函数 | float类型的浮点数x | 支持 | +| [logbl](#logbl) | double类型x以FLT_RADIX为的底数到对数函数 | double类型的浮点数x | 支持 | +| [lrint](#lrint) | 根据当前舍入模式,将参数舍入为long int类型的最接近整数值 | double类型的浮点数x | 支持 | +| [lrintf](#lrintf) | 根据当前舍入模式,将参数舍入为long int类型的最接近整数值 | float类型的浮点数x | 支持 | +| [lrintl](#lrintl) | 根据当前舍入模式,将参数舍入为long int类型的最接近整数值 | long double类型的浮点数x | 支持 | +| [lround](#lround) | 将double类型x舍入为浮点形式表示的long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | double类型的浮点数x | 支持 | +| [lroundf](#lroundf) | 将float类型x舍入为浮点形式表示的long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | float类型的浮点数x | 支持 | +| [lroundl](#lroundl) | 将long double类型x舍入为浮点形式表示的long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | long double类型的浮点数x | 支持 | +| [modf](#modf) | 将double类型的参数value分成整数部分和小数部分,两部分与参数value具有相同的类型和符号。整数部分以浮点形式存入参数iptr指向的对象中 | double类型的浮点数value
double *类型的指数iptr | 支持 | +| [modff](#modff) | 将float类型的参数value分成整数部分和小数部分,两部分与参数value具有相同的类型和符号。整数部分以浮点形式存入参数iptr指向的对象中 | float类型的浮点数value
float *类型的指数iptr | 支持 | +| [modfl](#modfl) | 将long double类型的参数value分成整数部分和小数部分,两部分与参数value具有相同的类型和符号。整数部分以浮点形式存入参数iptr指向的对象中 | long double类型的浮点数value
long double *类型的指数iptr | 支持 | +| [nan](#nan) | 返回一个double类型的非数值NaN,内容由参数tagp确定 | const char*类型tagp | 支持 | +| [nanf](#nanf) | 返回一个float类型的非数值NaN,内容由参数tagp确定 | const char*类型tagp | 支持 | +| [nanl](#nanl) | 返回一个long double类型的非数值NaN,内容由参数tagp确定 | const char*类型tagp | 支持 | +| [nearbyint](#nearbyint) | 根据当前舍入模式,将double型参数x舍入为浮点格式的double型整数值 | double类型x | 支持 | +| [nearbyintf](#nearbyintf) | 根据当前舍入模式,将float型参数x舍入为浮点格式的float型整数值 | float类型x | 支持 | +| [nearbyintl](#nearbyintl) | 根据当前舍入模式,将long double型参数x舍入为浮点格式的double型整数值 | long double类型x | 支持 | +| [nextafter](#nextafter) | 返回double类型参数x沿参数y方向的下一个可表示值 | double类型x
double类型y | 支持 | +| [nextafterf](#nextafterf) | 返回double类型参数x沿参数y方向的下一个可表示值 | float类型x
flaot类型y | 支持 | +| [nextafterl](#nextafterl) | 返回double类型参数x沿参数y方向的下一个可表示值 | long double类型x
long double类型y | 支持 | +| [nexttoward](#nexttoward) | 返回double类型参数x沿参数y方向的下一个可表示值,等价于nextafter,区别在于参数y为long double | double类型浮点数x
long double类型浮点数y | 支持 | +| [nexttowardf](#nexttowardf) | 返回double类型参数x沿参数y方向的下一个可表示值,等价于nextafter,区别在于参数y为long double | float类型浮点数x
long double类型浮点数y | 支持 | +| [nexttowardl](#nexttowardl) | 返回double类型参数x沿参数y方向的下一个可表示值,等价于nextafter,区别在于参数y为long double | long double类型浮点数x
long double类型浮点数y | 支持 | +| [pow](#pow) | 计算表达式$x^y$的值 | double类型浮点数x
double类型浮点数y | 支持 | +| [powf](#powf) | 计算表达式$x^y$的值 | float类型浮点数x
float类型浮点数y | 支持 | +| [powl](#powl) | 计算表达式$x^y$的值 | long double类型浮点数x
long double类型浮点数y | 支持 | +| [pow10](#pow10) | 计算表达式$10^x$的值 | double类型浮点数x | 支持 | +| [pow10f](#pow10f) | 计算表达式$10^x$的值 | float类型浮点数x| 支持 | +| [pow10l](#pow10l) | 计算表达式$10^x$的值 | long double类型浮点数x | 支持 | +| [remainder](#remainder) | 计算参数x除以y的余数,等同于drem | double类型浮点数x
double类型浮点数y | 支持 | +| [remainderf](#remainderf) | 计算参数x除以y的余数,等同于dremf | float类型浮点数x
float类型浮点数y | 支持 | +| [remainderl](#remainderl) | 计算参数x除以y的余数 | long double类型浮点数x
long double类型浮点数y | 支持 | +| [remquo](#remquo) | 计算参数x和参数y的浮点余数,并将商保存在传递的参数指针quo中 | double类型浮点数x
double类型浮点数y
int *类型商que | 支持 | +| [remquof](#remquof) | 计算参数x和参数y的浮点余数,并将商保存在传递的参数指针quo中 | float类型浮点数x
float类型浮点数y
int *类型商que | 支持 | +| [remquol](#remquol) | 计算参数x和参数y的浮点余数,并将商保存在传递的参数指针quo中 | long double类型浮点数x
long double类型浮点数y
int *类型商que | 支持 | +| [rint](#rint) | 根据当前舍入模式,将参数x舍入为浮点个数的整数值 | double类型的浮点数x | 支持 | +| [rintf](#rintf) | 根据当前舍入模式,将参数x舍入为浮点个数的整数值 | float类型的浮点数x | 支持 | +| [rintl](#rintl) | 根据当前舍入模式,将参数x舍入为浮点个数的整数值 | long double类型的浮点数x | 支持 | +| [round](#round) | 将double类型x舍入为浮点形式表示的double型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | double类型的浮点数x | 支持 | +| [roundf](#roundf) | 将float类型x舍入为浮点形式表示的float型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | float类型的浮点数x | 支持 | +| [roundl](#roundl) | 将long double类型x舍入为浮点形式表示的long double型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | long double类型的浮点数x | 支持 | +| [scalb](#scalb) | 计算$x * FLT\_RADIX^{exp}$的double类型值 | double类型的浮点数x
double类型的指数exp | 支持 | +| [scalbf](#scalbf) | 计算$x * FLT\_RADIX^{exp}$的float类型值 | float类型的浮点数x
float类型的指数exp | 支持 | +| [scalbln](#scalbln) | 计算$x * FLT\_RADIX^{exp}$的double类型值 | double类型的浮点数x
long类型的指数exp | 支持 | +| [scalblnf](#scalblnf) | 计算$x * FLT\_RADIX^{exp}$的float类型值 | float类型的浮点数x
long类型的指数exp | 支持 | +| [scalblnl](#scalblnl) | 计算$x * FLT\_RADIX^{exp}$的long double类型值 | long double类型的浮点数x
long类型的指数exp | 支持 | +| [scalbn](#scalbn) | 计算$x * FLT\_RADIX^{exp}$的double类型值 | double类型的浮点数x
int类型的指数exp | 支持 | +| [scalbnf](#scalbnf) | 计算$x * FLT\_RADIX^{exp}$的float类型值 | float类型的浮点数x
int类型的指数exp | 支持 | +| [scalbnl](#scalbnl) | 计算$x * FLT\_RADIX^{exp}$的long double类型值 | long double类型的浮点数x
int类型的指数exp | 支持 | +| [significand](#significand) | 用于分离浮点数x的尾数部分,返回double类型 | double类型的浮点数x | 支持 | +| [significandf](#significandf) | 用于分离浮点数x的尾数部分,返回double类型 | double类型的浮点数x | 支持 | +| [sin](#sin) | 计算参数x的正弦值,参数应为弧度值,返回double类型 | double类型的浮点数x | 支持 | +| [sinf](#sinf) | 计算参数x的正弦值,参数应为弧度值,返回float类型 | float类型的浮点数x | 支持 | +| [sinl](#sinl) | 计算参数x的正弦值,参数应为弧度值,返回long double类型 | long double类型的浮点数x | 支持 | +| [sincos](#sincos) | 同时计算参数x的正弦值和余弦值,并将结果存储在*sin和*cos,比单独调用sin和cos效率更高 | double类型的浮点数x
double*类型的浮点数sin
double*类型的浮点数cos | 支持 | +| [sincosf](#sincosf) | 同时计算参数x的正弦值和余弦值,并将结果存储在*sin和*cos,比单独调用sin和cos效率更高 | float类型的浮点数x
float*类型的浮点数sin
float*类型的浮点数cos | 支持 | +| [sincosl](#sincosl) | 同时计算参数x的正弦值和余弦值,并将结果存储在*sin和*cos,比单独调用sin和cos效率更高 | long double类型的浮点数x
long double*类型的浮点数sin
long double*类型的浮点数cos | 支持 | +| [sinh](#sinh) | 计算参数x的双曲正弦值,返回double类型 | double类型的浮点数x | 支持 | +| [sinhf](#sinhf) | 计算参数x的双曲正弦值,返回float类型 | float类型的浮点数x | 支持 | +| [sinhl](#sinhl) | 计算参数x的双曲正弦值,返回long double类型 | long double类型的浮点数x | 支持 | +| [sqrt](#sqrt) | 计算参数x的平方根,返回类型double | double类型的浮点数x | 支持 | +| [sqrtf](#sqrtf) | 计算参数x的平方根,返回类型float | float类型的浮点数x | 支持 | +| [sqrtl](#sqrtl) | 计算参数x的平方根,返回类型long double | long double类型的浮点数x | 支持 | +| [tan](#tan) | 计算参数x的正切值,参数应为弧度值,返回double类型 | double类型的浮点数x | 支持 | +| [tanf](#tanf) | 计算参数x的正切值,参数应为弧度值,返回float类型 | float类型的浮点数x | 支持 | +| [tanl](#tanl) | 计算参数x的正切值,参数应为弧度值,返回long double类型 | long double类型的浮点数x | 支持 | +| [tanh](#tanh) | 计算参数x的双曲正切值,返回double类型 | double类型的浮点数x | 支持 | +| [tanhf](#tanhf) | 计算参数x的双曲正切值,返回float类型 | float类型的浮点数x | 支持 | +| [tanhl](#tanhl) | 计算参数x的双曲正切值,返回long double类型 | long double类型的浮点数x | 支持 | +| [tgamma](#tgamma) | 计算参数x的伽马函数,返回double类型 | double类型的浮点数x | 支持 | +| [tgammaf](#tgammaf) | 计算参数x的伽马函数,返回float类型 | float类型的浮点数x | 支持 | +| [tgammal](#tgammal) | 计算参数x的伽马函数,返回long double类型 | long double类型的浮点数x | 支持 | +| [trunc](#trunc) | 截取参数x的整数部分,并将整数部分以浮点形式表示 | double类型的浮点数x | 支持 | +| [truncf](#truncf) | 截取参数x的整数部分,并将整数部分以浮点形式表示 | float类型的浮点数x | 支持 | +| [truncl](#truncl) | 截取参数x的整数部分,并将整数部分以浮点形式表示 | long double类型的浮点数x | 支持 | +| [y0](#y0) | 计算参数x的第二类0阶贝塞尔函数 | double类型的浮点数x | 支持 | +| [y0f](#y0f) | 计算参数x的第二类0阶贝塞尔函数 | float类型的浮点数x | 支持 | +| [y1](#y1) | 计算参数x的第二类1阶贝塞尔函数 | double类型的浮点数x | 支持 | +| [y1f](#y1f) | 计算参数x的第二类1阶贝塞尔函数 | float类型的浮点数x | 支持 | +| [yn](#yn) | 计算参数x的第二类n阶贝塞尔函数 | int类型阶数n
double类型的浮点数x | 支持 | +| [ynf](#ynf) | 计算参数x的第二类n阶贝塞尔函数 | int类型阶数n
float类型的浮点数x | 支持 | + +## 设备驱动 + +### register_driver + +在文件系统中注册一个字符设备驱动程序。 + +**参数**: + +1. 要创建的索引节点的路径path。 +2. file_operations结构体指针fops。 +3. 访问权限mode。 +4. 将与inode关联的私有用户数据priv。 + +**输出**: + +- 0:操作成功。 +- 负数值:操作失败。 + +#### unregister_driver + +从文件系统中删除“path”处的字符驱动程序。 + +**参数**: + +1. 要删除的索引节点的路径path。 + +**输出**: + +- 0:操作成功。 +- -EINVAL:无效的path路径。 +- -EEXIST:path中已存在inode。 +- -ENOMEM:内存不足。 + +#### register_blockdriver + +在文件系统中注册一个块设备驱动程序。 + +**参数**: + +1. 要创建的索引节点的路径path。 +2. block_operations结构体指针bops。 +3. 访问权限mode。 +4. 将与inode关联的私有用户数据priv。 + +**输出**: + +- 0:操作成功。 +- -EINVAL:无效的path路径。 +- -EEXIST:path中已存在inode。 +- -ENOMEM:内存不足。 + +#### unregister_blockdriver + +从文件系统中删除“path”处的块设备驱动程序。 + +**参数**: + +1. 要删除的索引节点的路径path。 + +**输出**: + +- 0:操作成功。 +- -EINVAL:无效的path路径。 +- -EEXIST:path中已存在inode。 +- -ENOMEM:内存不足。 + +## Shell模块 + +### SHELLCMD_ENTRY + +向Shell模块静态注册命令。 + +**参数**: + +1. 命令变量名name。 +2. 命令类型cmdType。 +3. 命令关键字cmdKey。 +4. 处理函数的入参最大个数paraNum。 +5. 命令处理函数回调cmdHook。 + +**输出**:无 + +### osCmdReg + +向Shell模块动态注册命令。 + +**参数**: + +1. 命令类型cmdType。 +2. 命令关键字cmdKey。 +3. 处理函数的入参最大个数paraNum。 +4. 命令处理函数回调cmdHook。 + +**输出**: + +- 0:操作成功。 +- OS_ERRNO_SHELL_NOT_INIT:shell模块未初始化。 +- OS_ERRNO_SHELL_CMDREG_PARA_ERROR:无效的输入参数。 +- OS_ERRNO_SHELL_CMDREG_CMD_ERROR:无效的字符串关键字。 +- OS_ERRNO_SHELL_CMDREG_CMD_EXIST:关键字已存在。 +- OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR:内存不足。 diff --git a/doc/zh/uniproton-functions.md b/doc/zh/uniproton-functions.md new file mode 100644 index 00000000..72713adc --- /dev/null +++ b/doc/zh/uniproton-functions.md @@ -0,0 +1,195 @@ +# UniProton功能设计 + + + +- [UniProton功能设计](#uniproton功能设计) + + - [支持任务管理](#支持任务管理) + + - [支持事件管理](#支持事件管理) + + - [支持队列管理](#支持队列管理) + + - [支持硬中断管理](#支持硬中断管理) + + - [支持内存管理](#支持内存管理) + + [FSC内存算法](#fsc内存算法) + + [核心思想](#核心思想) + + [内存申请](#内存申请) + + [内存释放](#内存释放) + + - [支持定时器管理](#支持定时器管理) + + - [支持信号量管理](#支持信号量管理) + + - [支持异常管理](#支持异常管理) + + - [支持CPU占用率统计](#支持cpu占用率统计) + + - [支持STM32F407ZGT6开发板](#支持stm32f407zgt6开发板) + + - [支持OpenAMP混合部署](#支持openamp混合部署) + + - [支持POSIX标准接口](#支持posix标准接口) + + + +## 支持任务管理 + +UniProton是一个单进程支持多线程的操作系统。在UniProton中,一个任务表示一个线程。UniProton中的任务为抢占式调度机制,而非时间片轮转调度方式。高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务挂起或阻塞后才能得到调度。 + +UniProton的任务一共有32个优先级(0-31),最高优先级为0,最低优先级为31。每个优先级可以创建多个任务。 + +UniProton任务管理模块提供任务创建、任务删除、任务挂起、任务恢复、任务延时、锁任务调度、解锁任务调度、当前任务ID获取、任务私有数据获取与设置、查询指定任务正在Pending的信号量ID、查询指定任务状态、上下文信息、任务通用信息、任务优先级设定与获取、调整指定优先级的任务调度顺序、注册及取消任务创建钩子、任务删除钩子、任务切换钩子等功能。UniProton在初始化阶段,默认会创建一个最低优先级的IDLE任务,用户在没有处于运行态的任务时,IDLE任务被运行。 + +## 支持事件管理 + +事件机制可以实现线程之间的通讯。事件通讯只能是事件类型的通讯,无数据传输。 + +UniProton事件作为任务的扩展,实现任务之间的通讯。每个任务支持32种类型事件(32个 bit位,每bit代表一种事件类型)。 + +UniProton提供读取本任务事件和写指定任务事件的功能。读事件时可以同时读取多种事件,也可以只读取一种事件,写事件时也可以同时写一种或多种类型事件。 + +## 支持队列管理 + +队列(Queue),又称消息队列,是线程间实现通信的一种方式,实现了数据的存储和传递功能。根据优先级可以将数据写入到队列头或队列尾,但只能从队列的头处读取数据。 + +UniProton创建队列时,根据用户传入队列长度和消息单元大小来开辟相应的内存空间以供该队列使用。在队列控制块中维护一个头指针Head和一个尾指针Tail来表示当前队列中数据存储情况。头指针Head表示队列中被占用消息的起始地址,尾指针Tail表示队列中空闲消息的起始地址。 + +## 支持硬中断管理 + +硬中断是由硬件触发的会改变系统运行轨迹的一个电平信号,硬中断用于通知CPU某个硬件事件的发生。硬中断一般分为可屏蔽中断和不可屏蔽中断(NMI)两种。 + +硬中断的优先级高于所有任务,其内部也有不同的优先级,当同时有多个硬中断被触发时,最高优先级的硬中断总是优先得到响应。高优先级硬中断是否能打断正在执行的低优先级硬中断(即中断嵌套),视不同芯片平台而异。 + +出于任务延时、软件定时器等需要,OS会在初始化阶段,创建1个Tick硬中断,其实质是一个周期性的硬件定时器。 + +## 支持内存管理 + +内存管理主要工作是动态的划分并管理用户分配好的大片内存区间。当程序某一部分需要使用内存,可以通过操作系统的内存申请函数索取指定大小内存块,一旦使用完毕,通过内存释放函数归还所占用内存,使之可以重复使用。 + +目前UniProton提供了FSC内存算法,该算法优缺点及应用场景如下表所示: + +| 内存算法 | 优点 | 缺点 | 应用场景 | +| :----------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------ | ------------------------------------ | +| 类型私有FSC算法 | 内存控制块信息占用内存较少,支持最小4字节对齐的内存块大小申请;支持相邻内存块的快速分割合并,无内存碎片。 | 内存申请和内存释放的效率较低。 | 能够灵活适应各种产品的场景。 | + +如下简要描述一下FSC内存算法: + +### FSC内存算法 + +#### 核心思想 + +对于申请的内存大小为uwSize,如果用二进制,则表示为0b{0}1xxx,{0}表示1前面可能有0个或多个零。无论1后面xxx为何内容,如果将1变成10,xxx则全部变成0,则总会出现10yyy > 1xxx(此处yyy表示xxx的对应位全部变成0)。 + +我们可以直接得到最左边的1的下标。下标值或者从高位到低位依次为0-31(BitMap),或者从低位到高位依次为0-31(uwSize)。如果32位寄存器从高位到低位的bit位的下标依次为0-31,则0x80004000的最左边1的下标为0。于是我们可以维护一个空闲链表头数组(元素数不超过31),以内存块大小最左边的1的下标做为链表头的数组索引,即将所有最左边的1的下标相同的内存块挂接在同一个空闲链表中。 + +如:索引为2的链表可挂接的空闲块大小为4、5、6、7;索引为N的链表可挂接的空闲块大小为2^N到2^(N+1)-1。 + +![](./figures/FCS.png) + +#### 内存申请 + +当申请uwSize大小的内存时,首先利用汇编指令得到最左边的1的下标,假定为n。为确保空闲链表中的第一个空闲内存块满足uwSize,从索引为n+1开始搜索。若n+1所属空闲链表不为空,则取该链表中的第一个空闲块。若n+1链表为空,则判断n+2链表,依次类推,直到找到非空链表或索引达到31。 + +为避免for循环逐级判断空闲链表是否为空,定义一个32位的BitMap全局变量。若索引n的空闲链表非空,则BitMap的下标为n的位置1,否则清0。BitMap的下标为31的位在初始化时直接置1。于是查找从n+1开始的第一个非空闲链表,可以首先将BitMap复本的0到n位清零,然后获取复本的最左边的1的下标,若不等于31,即为第一个空闲链表非空的数组索引。 + +所有的空闲块都以双向链表的形式,串接在空闲链表中。若从链表中获取的第一个空闲块比较大,即分割出一个uwSize的内存块后,剩下的空间至少可做一次最小分配,则将剩余的空闲块调整到对应的空闲链表中。 + + ![](./figures/MemoryApplication.png) + +内存控制头中记录空闲内存块的大小(包括控制头本身)。内存控制头中有一个复用成员,位于最首部。当内存块空闲时,作为指向后一个空闲内存块的指针;当内存块占用时,存放魔术字,表示该内存块非空闲。为避免魔术字与指针冲突(与地址值相同),高低4位均为0xf。因为已分配的内存块起始地址需按4字节对齐,所以不存在冲突。 + +#### 内存释放 + +当释放内存时,需要将前后相邻的空闲块进行合并。首先,通过判断控制头中的魔术字,确认地址参数(pAddr)的合法性。通过首地址加偏移值的方式,得到后邻的内存块控制头的起始地址。若后邻内存块是空闲的,则将后邻内存块从所属空闲链表中删除,调整当前内存块的大小。 + +为了使内存释放时能迅速找到前邻的内存块控制头,及判断前邻的内存块是否空闲。内存控制头中增加一个成员,标记前邻的内存块是否空闲。可在内存申请时,将后邻的该标记设置为占用态(若空闲内存块被分割成两块,前一块为空闲,将当前内存块的该标记设置为空闲态);在内存释放时,将后邻的该标记设置为空闲态。释放当前内存时,若前邻的内存块标记为使用,则不需要合并前邻的内存块;若前邻的内存块标记为空闲,则需要进行合并。若某个内存块为空闲时,则将其后邻控制块的标记设为到本控制块的距离值。 + + ![](./figures/MemoryRelease.png) + +## 支持定时器管理 + +定时器管理是为满足产品定时业务需要,UniProton提供了软件定时器功能。 + +对于软件定时器,是基于Tick实现,所以定时周期必须为Tick的整数倍,在Tick处理函数中进行软件定时器的超时扫描。 + +目前提供的软件定时器接口,可以完成定时器创建,启动,停止,重启,删除操作。 + +## 支持信号量管理 + +信号量(Semaphore)常用于协助一组互相竞争的任务来访问临界资源,在需要互斥的场合作为临界资源计数使用,根据临界资源使用场景分为核内信号量和核间信号量。 + +信号量对象有一个内部计数器,它支持如下两种操作: + +- 申请(Pend):Pend 操作等待指定的信号量,若其计数器值大于0,则直接减1返回成功。否则任务阻塞,等待其他线程发布该信号量,等待的容忍时间可设定。 + +- 释放(Post):Post操作发布指定的信号量,若无任务等待该信号量,则直接将计数器加1返回。否则唤醒为此信号量挂起的任务列表中的第一个任务(最早阻塞的)。 + +通常一个信号量的计数值用于对应有效的资源数,表示剩余可被占用的互斥资源数。其值的含义如下有两种情况: + +- 为0值:表示没有积累下来的Post操作,且有可能有在此信号量上阻塞的任务。 + +- 为正值:表示有一个或多个Post下来的发布操作。 + +## 支持异常管理 + +UniProton中的异常接管属于维测特性,其主要目的是在系统出现异常后,记录尽可能多的异常现场信息,便于后续问题定位。同时提供异常时的钩子函数,便于用户能够在异常发生时做一些用户化的特殊处理。其主要功能是接管内部异常处理或者外部硬件异常。 + +## 支持CPU占用率统计 + +UniProton中的系统CPU占用率(CPU Percent)是指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPU占用率的有效表示范围为0~10000,其精度为万分比。10000表示系统满负荷运转。 + +UniProton中的线程CPU占用率指单个线程的CPU占用率,用于表示单个线程在一段时间内的闲忙程度。线程CPU占用率的有效表示范围为0~10000,其精度为万分比。10000表示在一段时间内系统一直在运行该线程。单核系统所有线程(包括中断和空闲任务)的CPU之和为10000。 + +UniProton的系统级CPU占用率依赖于Tick模块,通过Tick采样IDLE任务或IDLE软中断计数来实现 + +## 支持STM32F407ZGT6开发板 + +支持开发板主要涉及OS内核外围的启动流程和单板驱动,目录结构如下: + +├─apps # 基于UniProton实时OS编程的demo程序。 + +│ └─hello_world # hello_world示例程序。 + +├─bsp # 提供的板级驱动与OS对接。 + +├─build # 提供编译脚本编译出最终镜像。 + +├─config # 配置选项,供用户调整运行时参数。 + +├─include # UniProton实时部分提供的编程接口API。 + +└─libs # UniProton实时部分的静态库,build目录中的makefile示例已经将头文件和静态库的引用准备好,应用可直接使用。 + +## 支持OpenAMP混合部署 + +OpenAMP是一个开源软件框架,旨在通过非对称多处理器的开源解决方案,来标准化异构嵌入式系统中操作环境之间的交互。OpenAMP包括如下四大组件: + +1. remoteproc:管理从核的生命周期,管理共享内存、通信使用的buffer、vring等资源,初始化rpmsg和virtio。 +2. rpmsg:实现多核通信的通道,基于virtio实现。 +3. virtio:通过一套虚拟IO实现主从核的驱动程序通信,是一种半虚拟化技术。 +4. libmetal:屏蔽操作系统实现细节,提供通用用户API访问设备,处理设备中断、内存请求。 + +## 支持POSIX标准接口 + +[UniProton支持posix标准接口](./uniproton-apis.md) + +## 支持设备驱动 + +UniProton的驱动结构、风格与linux类似,将驱动设备文件化,即VFS系统,通过驱动注册接口,将驱动注册到文件系统中,应用层只需要通过标准系统调用,即可调用底层驱动。整个驱动框架代码适配自开源RTOS系统Nuttx的驱动模块,因此接口调用也与Nuttx基本一致。struct file_operations结构体保存设备文件操作的方法,定义在fs.h头文件中,通过register_driver接口将驱动设备挂到对应的struct inode节点中,struct inode描述了每个设备节点的位置和数据。当系统调用操作设备文件时,根据对应文件的inode就能索引到对应的函数。接口详细信息可以查看[UniProton接口说明](./uniproton-apis.md)。 + +## 支持Shell命令行 + +UniProton提供shell命令行,它能够以命令行交互的方式访问操作系统的功能或服务:它接受并解析用户输入的命令,并处理操作系统的输出结果。UniProton的shell模块代码适配自开源ROTS系统LiteOS的shell模块。因此与LiteOS一致,用户可以新增定制的命令,新增命令需重新编译烧录后才能执行。当前UniProton只支持了help命令,其他命令将在后续的版本中进行完善。Shell模块为用户提供下面几个接口。 + +| 接口名 | 描述 | +| :---: | :--: | +| SHELLCMD_ENTRY | 静态注册命令 | +| osCmdReg | 动态注册命令 | + +通常静态注册命令方式一般用于注册系统常用命令,动态注册命令方式一般用于注册用户命令。静态注册命令有5个入参,动态注册命令有4个入参。下面除去第一个入参是静态注册独有的,剩余的四个入参两个注册命令是一致的。接口详细信息可以查看[UniProton接口说明](./uniproton-apis.md) -- Gitee