专用于实时分配的内存区域。
专用于实时分配的内存区域。
堆是用于动态内存分配的内存区域,这种分配方式具有时间限制。内存块以任意顺序分配和释放,分配模式和块大小直到运行时才知道。
int rt_heap_alloc (RT_HEAP *heap, size_t size, RTIME timeout, void **blockp);
从堆中分配一个块(具有相对标量超时)。
此例程是 rt_heap_alloc_timed() 的一个变体,接受以标量值表示的相对超时规范。在 timeout 中传递 TM_INFINITE 会导致调用者无限期阻塞,直到有可用的块。在 timeout 中传递 TM_NONBLOCK 会导致服务在块不可用的情况下立即返回,而不会阻塞。
标签
xthread-nowait
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/heap.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
#define HEAP_SIZE 1024 * 10 // 10KB 堆大小
#define ALLOC_SIZE 1024 // 要分配的块大小
RT_HEAP heap_desc;
void heap_task(void *arg)
{
int ret;
char *block_ptr;
char test_data[50] = "This is the test data for heap";
printf("Task: Try to alloc from heap....\n");
ret = rt_heap_alloc(&heap_desc, ALLOC_SIZE, TM_INFINITE, (void **)&block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_alloc %s\n", strerror(-ret));
return;
}
printf("Task: Success alloc %d bytes from heap,Addr: %p\n", ALLOC_SIZE, block_ptr);
// 使用分配的内存...
memcpy(block_ptr,test_data,strlen(test_data));
printf("Task: %s\n",block_ptr);
// 释放内存
ret = rt_heap_free(&heap_desc, block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_free %s\n", strerror(-ret));
} else {
printf("Task: released successfully\n");
}
}
int main(int argc, char *argv[])
{
RT_TASK task_desc;
int ret;
// 创建堆
ret = rt_heap_create(&heap_desc, "MyHeap", HEAP_SIZE, H_FIFO);
if (ret) {
fprintf(stderr, "Main: rt_heap_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务
ret = rt_task_create(&task_desc, "HeapTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Main: rt_task_create %s\n", strerror(-ret));
rt_heap_delete(&heap_desc);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task_desc, &heap_task, NULL);
// 等待任务完成
rt_task_join(&task_desc);
// 清理
rt_heap_delete(&heap_desc);
rt_task_delete(&task_desc);
return EXIT_SUCCESS;
}
int rt_heap_alloc_timed (RT_HEAP *heap, size_t size, const struct timespec *abs_timeout, void **blockp);
从堆中分配一个块。
此服务从给定的堆中分配一个块,或者如果在 rt_heap_create() 的创建模式中提到了 H_SINGLE,那么返回单个内存段的地址。当在进入此服务时没有足够的内存可用,任务可能会被阻塞,直到他们的分配请求可以被满足。
参数
返回值
成功时返回零。否则:
标签
xthread-nowait
, switch-primary
注意
如果启用了共享多处理(即,传递了 --enable-pshared 到 configure 脚本),那么请求的块大小大于两倍的分配页面大小的请求将被向上舍入到下一个页面大小。当前的分配页面大小为 512 字节(HOBJ_PAGE_SIZE),这意味着任何大于 1k 的请求都将被向上舍入到下一个 512 字节边界。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/heap.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
#define HEAP_SIZE 1024 * 10 // 10KB 堆大小
#define ALLOC_SIZE 1024 // 要分配的块大小
RT_HEAP heap_desc;
void heap_task(void *arg)
{
int ret;
char *block_ptr;
char test_data[50] = "This is the test data for heap";
printf("Task: Try to alloc from heap....\n");
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
ts.tv_sec += 2; // 2 seconds
ret = rt_heap_alloc_timed(&heap_desc, ALLOC_SIZE, &ts, (void **)&block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_alloc %s\n", strerror(-ret));
return;
}
printf("Task: Success alloc %d bytes from heap,Addr: %p\n", ALLOC_SIZE, block_ptr);
// 使用分配的内存...
memcpy(block_ptr,test_data,strlen(test_data));
printf("Task: %s\n",block_ptr);
// 释放内存
ret = rt_heap_free(&heap_desc, block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_free %s\n", strerror(-ret));
} else {
printf("Task: released successfully\n");
}
}
int main(int argc, char *argv[])
{
RT_TASK task_desc;
int ret;
// 创建堆
ret = rt_heap_create(&heap_desc, "MyHeap", HEAP_SIZE, H_FIFO);
if (ret) {
fprintf(stderr, "Main: rt_heap_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务
ret = rt_task_create(&task_desc, "HeapTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Main: rt_task_create %s\n", strerror(-ret));
rt_heap_delete(&heap_desc);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task_desc, &heap_task, NULL);
// 等待任务完成
rt_task_join(&task_desc);
// 清理
rt_heap_delete(&heap_desc);
rt_task_delete(&task_desc);
return EXIT_SUCCESS;
}
int rt_heap_alloc_until (RT_HEAP *heap, size_t size, RTIME timeout, void **blockp);
从堆中分配一个块(具有绝对标量超时)。
此例程是 rt_heap_alloc_timed() 的一个变体,接受以标量值表示的绝对超时规范。在 timeout 中传递 TM_INFINITE 会导致调用者无限期阻塞,直到有可用的块。在 timeout 中传递 TM_NONBLOCK 会导致服务在块不可用的情况下立即返回,而不会阻塞。
参数
标签
xthread-nowait
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/heap.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
#define HEAP_SIZE 1024 * 10 // 10KB 堆大小
#define ALLOC_SIZE 1024 // 要分配的块大小
RT_HEAP heap_desc;
void heap_task(void *arg)
{
int ret;
char *block_ptr;
char test_data[50] = "This is the test data for heap";
printf("Task: Try to alloc from heap....\n");
RTIME timeout = rt_timer_read() + 2000000000; // 2 seconds
ret = rt_heap_alloc_until(&heap_desc, ALLOC_SIZE, timeout, (void **)&block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_alloc %s\n", strerror(-ret));
return;
}
printf("Task: Success alloc %d bytes from heap,Addr: %p\n", ALLOC_SIZE, block_ptr);
// 使用分配的内存...
memcpy(block_ptr,test_data,strlen(test_data));
printf("Task: %s\n",block_ptr);
// 释放内存
ret = rt_heap_free(&heap_desc, block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_free %s\n", strerror(-ret));
} else {
printf("Task: released successfully\n");
}
}
int main(int argc, char *argv[])
{
RT_TASK task_desc;
int ret;
// 创建堆
ret = rt_heap_create(&heap_desc, "MyHeap", HEAP_SIZE, H_FIFO);
if (ret) {
fprintf(stderr, "Main: rt_heap_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务
ret = rt_task_create(&task_desc, "HeapTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Main: rt_task_create %s\n", strerror(-ret));
rt_heap_delete(&heap_desc);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task_desc, &heap_task, NULL);
// 等待任务完成
rt_task_join(&task_desc);
// 清理
rt_heap_delete(&heap_desc);
rt_task_delete(&task_desc);
return EXIT_SUCCESS;
}
int rt_heap_bind (RT_HEAP *heap, const char *name, RTIME timeout);
绑定到一个堆。
此例程创建一个新的描述符来引用由其符号名称标识的现有堆。如果在入口处对象不存在,调用者可能会阻塞,直到创建了给定名称的堆。
参数
返回值
成功时返回零。否则:
标签
xthread-nowait
, switch-primary
注意
超时值被解释为 Alchemy 时钟分辨率的倍数(参见 -alchemy-clock-resolution 选项,默认为 1 纳秒)。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/heap.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
#define HEAP_SIZE 1024 * 10 // 10KB 堆大小
#define ALLOC_SIZE 1024 // 要分配的块大小
RT_HEAP heap_desc;
void heap_task(void *arg)
{
int ret;
char *block_ptr;
char test_data[50] = "This is the test data for heap";
RT_HEAP heap_task;
ret = rt_heap_bind(&heap_task,"MyHeap",TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_heap_bind %s\n", strerror(-ret));
return;
}
printf("Task: Bind to heap, Try to alloc from heap....\n");
ret = rt_heap_alloc(&heap_task, ALLOC_SIZE, TM_INFINITE, (void **)&block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_alloc %s\n", strerror(-ret));
return;
}
printf("Task: Success alloc %d bytes from heap,Addr: %p\n", ALLOC_SIZE, block_ptr);
// 使用分配的内存...
memcpy(block_ptr,test_data,strlen(test_data));
printf("Task: %s\n",block_ptr);
// 释放内存
ret = rt_heap_free(&heap_task, block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_free %s\n", strerror(-ret));
} else {
printf("Task: released successfully\n");
}
rt_heap_unbind(&heap_task);
}
int main(int argc, char *argv[])
{
RT_TASK task_desc;
int ret;
// 创建堆
ret = rt_heap_create(&heap_desc, "MyHeap", HEAP_SIZE, H_FIFO);
if (ret) {
fprintf(stderr, "Main: rt_heap_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务
ret = rt_task_create(&task_desc, "HeapTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Main: rt_task_create %s\n", strerror(-ret));
rt_heap_delete(&heap_desc);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task_desc, &heap_task, NULL);
// 等待任务完成
rt_task_join(&task_desc);
// 清理
rt_heap_delete(&heap_desc);
rt_task_delete(&task_desc);
return EXIT_SUCCESS;
}
int rt_heap_create (RT_HEAP *heap, const char *name, size_t heapsize, int mode);
创建一个堆。
此例程创建一个适合时间有界的 RAM 块分配请求的内存堆。当没有足够的内存可用时,任务可能会被阻塞,直到他们的分配请求可以被满足。
默认情况下,堆支持以任意顺序分配多个内存块。然而,通过将 H_SINGLE 标志传递到 mode 参数中,可以请求单块管理,在这种情况下,堆管理的整个内存空间作为一个唯一的块提供。在这种模式下,通过 rt_heap_alloc() 做出的所有分配请求都将返回相同的块地址,指向堆内存的开始。
参数
返回值
成功时返回零。否则:
标签
xthread-only
, mode-unrestricted
, switch-secondary
注意
属于同一 Xenomai 会话的多个进程可以共享堆。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/heap.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
#define HEAP_SIZE 1024 * 10 // 10KB 堆大小
#define ALLOC_SIZE 1024 // 要分配的块大小
RT_HEAP heap_desc;
void heap_task(void *arg)
{
int ret;
char *block_ptr;
char test_data[50] = "This is the test data for heap";
printf("Task: Try to alloc from heap....\n");
ret = rt_heap_alloc(&heap_desc, ALLOC_SIZE, TM_INFINITE, (void **)&block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_alloc %s\n", strerror(-ret));
return;
}
printf("Task: Success alloc %d bytes from heap,Addr: %p\n", ALLOC_SIZE, block_ptr);
// 使用分配的内存...
memcpy(block_ptr,test_data,strlen(test_data));
printf("Task: %s\n",block_ptr);
// 释放内存
ret = rt_heap_free(&heap_desc, block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_free %s\n", strerror(-ret));
} else {
printf("Task: released successfully\n");
}
}
int main(int argc, char *argv[])
{
RT_TASK task_desc;
int ret;
// 创建堆
ret = rt_heap_create(&heap_desc, "MyHeap", HEAP_SIZE, H_FIFO);
if (ret) {
fprintf(stderr, "Main: rt_heap_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务
ret = rt_task_create(&task_desc, "HeapTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Main: rt_task_create %s\n", strerror(-ret));
rt_heap_delete(&heap_desc);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task_desc, &heap_task, NULL);
// 等待任务完成
rt_task_join(&task_desc);
// 清理
rt_heap_delete(&heap_desc);
rt_task_delete(&task_desc);
return EXIT_SUCCESS;
}
int rt_heap_delete (RT_HEAP *heap);
删除一个堆。
此例程删除由 rt_heap_create() 调用先前创建的堆对象,并释放当前阻塞在其上的所有任务。
参数
返回值
成功时返回零。否则:
标签
mode-unrestricted
, switch-secondary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/heap.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
#define HEAP_SIZE 1024 * 10 // 10KB 堆大小
#define ALLOC_SIZE 1024 // 要分配的块大小
RT_HEAP heap_desc;
void heap_task(void *arg)
{
int ret;
char *block_ptr;
char test_data[50] = "This is the test data for heap";
printf("Task: Try to alloc from heap....\n");
ret = rt_heap_alloc(&heap_desc, ALLOC_SIZE, TM_INFINITE, (void **)&block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_alloc %s\n", strerror(-ret));
return;
}
printf("Task: Success alloc %d bytes from heap,Addr: %p\n", ALLOC_SIZE, block_ptr);
// 使用分配的内存...
memcpy(block_ptr,test_data,strlen(test_data));
printf("Task: %s\n",block_ptr);
// 释放内存
ret = rt_heap_free(&heap_desc, block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_free %s\n", strerror(-ret));
} else {
printf("Task: released successfully\n");
}
}
int main(int argc, char *argv[])
{
RT_TASK task_desc;
int ret;
// 创建堆
ret = rt_heap_create(&heap_desc, "MyHeap", HEAP_SIZE, H_FIFO);
if (ret) {
fprintf(stderr, "Main: rt_heap_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务
ret = rt_task_create(&task_desc, "HeapTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Main: rt_task_create %s\n", strerror(-ret));
rt_heap_delete(&heap_desc);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task_desc, &heap_task, NULL);
// 等待任务完成
rt_task_join(&task_desc);
// 清理
rt_heap_delete(&heap_desc);
rt_task_delete(&task_desc);
return EXIT_SUCCESS;
}
int rt_heap_free (RT_HEAP *heap, void *block);
释放堆中的块。
此服务用于将块释放回其所属的堆。一旦块返回到内存池,将尝试满足所有阻塞在 rt_heap_alloc() 上的任务请求。
参数
返回值
成功时返回零。否则:
标签
unrestricted
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/heap.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
#define HEAP_SIZE 1024 * 10 // 10KB 堆大小
#define ALLOC_SIZE 1024 // 要分配的块大小
RT_HEAP heap_desc;
void heap_task(void *arg)
{
int ret;
char *block_ptr;
char test_data[50] = "This is the test data for heap";
printf("Task: Try to alloc from heap....\n");
ret = rt_heap_alloc(&heap_desc, ALLOC_SIZE, TM_INFINITE, (void **)&block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_alloc %s\n", strerror(-ret));
return;
}
printf("Task: Success alloc %d bytes from heap,Addr: %p\n", ALLOC_SIZE, block_ptr);
// 使用分配的内存...
memcpy(block_ptr,test_data,strlen(test_data));
printf("Task: %s\n",block_ptr);
// 释放内存
ret = rt_heap_free(&heap_desc, block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_free %s\n", strerror(-ret));
} else {
printf("Task: released successfully\n");
}
}
int main(int argc, char *argv[])
{
RT_TASK task_desc;
int ret;
// 创建堆
ret = rt_heap_create(&heap_desc, "MyHeap", HEAP_SIZE, H_FIFO);
if (ret) {
fprintf(stderr, "Main: rt_heap_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务
ret = rt_task_create(&task_desc, "HeapTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Main: rt_task_create %s\n", strerror(-ret));
rt_heap_delete(&heap_desc);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task_desc, &heap_task, NULL);
// 等待任务完成
rt_task_join(&task_desc);
// 清理
rt_heap_delete(&heap_desc);
rt_task_delete(&task_desc);
return EXIT_SUCCESS;
}
int rt_heap_inquire (RT_HEAP *heap, RT_HEAP_INFO *info);
查询堆状态。
此例程返回有关堆的状态信息。
参数
返回值
成功时返回零。否则:
标签
unrestricted
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/heap.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
#define HEAP_SIZE 1024 * 10 // 10KB 堆大小
#define ALLOC_SIZE 1024 // 要分配的块大小
RT_HEAP heap_desc;
void heap_task(void *arg)
{
int ret;
char *block_ptr;
char test_data[50] = "This is the test data for heap";
RT_HEAP_INFO info;
printf("Task: Try to alloc from heap....\n");
ret = rt_heap_alloc(&heap_desc, ALLOC_SIZE, TM_INFINITE, (void **)&block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_alloc %s\n", strerror(-ret));
return;
}
printf("Task: Success alloc %d bytes from heap,Addr: %p\n", ALLOC_SIZE, block_ptr);
// 使用分配的内存...
memcpy(block_ptr,test_data,strlen(test_data));
printf("Task: %s\n",block_ptr);
ret = rt_heap_inquire(&heap_desc,&info);
if (ret) {
fprintf(stderr, "Task: rt_heap_inquire %s\n", strerror(-ret));
return;
}
printf("Current heap information:\n");
printf("[ %s ] mode: %d, size: %d, use : %d, free : %d\n",
info.name, info.mode, info.heapsize, info.usedmem, info.usablemem - info.usedmem);
// 释放内存
ret = rt_heap_free(&heap_desc, block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_free %s\n", strerror(-ret));
} else {
printf("Task: released successfully\n");
}
}
int main(int argc, char *argv[])
{
RT_TASK task_desc;
int ret;
// 创建堆
ret = rt_heap_create(&heap_desc, "MyHeap", HEAP_SIZE, H_FIFO);
if (ret) {
fprintf(stderr, "Main: rt_heap_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务
ret = rt_task_create(&task_desc, "HeapTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Main: rt_task_create %s\n", strerror(-ret));
rt_heap_delete(&heap_desc);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task_desc, &heap_task, NULL);
// 等待任务完成
rt_task_join(&task_desc);
// 清理
rt_heap_delete(&heap_desc);
rt_task_delete(&task_desc);
return EXIT_SUCCESS;
}
int rt_heap_unbind (RT_HEAP *heap);
解除堆绑定。
参数
此例程释放之前对堆的绑定。此调用返回后,描述符将不再有效,无法引用该对象。
标签
thread-unrestricted
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/heap.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
#define HEAP_SIZE 1024 * 10 // 10KB 堆大小
#define ALLOC_SIZE 1024 // 要分配的块大小
RT_HEAP heap_desc;
void heap_task(void *arg)
{
int ret;
char *block_ptr;
char test_data[50] = "This is the test data for heap";
RT_HEAP heap_task;
ret = rt_heap_bind(&heap_task,"MyHeap",TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_heap_bind %s\n", strerror(-ret));
return;
}
printf("Task: Bind to heap, Try to alloc from heap....\n");
ret = rt_heap_alloc(&heap_task, ALLOC_SIZE, TM_INFINITE, (void **)&block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_alloc %s\n", strerror(-ret));
return;
}
printf("Task: Success alloc %d bytes from heap,Addr: %p\n", ALLOC_SIZE, block_ptr);
// 使用分配的内存...
memcpy(block_ptr,test_data,strlen(test_data));
printf("Task: %s\n",block_ptr);
// 释放内存
ret = rt_heap_free(&heap_task, block_ptr);
if (ret) {
fprintf(stderr, "Task: rt_heap_free %s\n", strerror(-ret));
} else {
printf("Task: released successfully\n");
}
rt_heap_unbind(&heap_task);
}
int main(int argc, char *argv[])
{
RT_TASK task_desc;
int ret;
// 创建堆
ret = rt_heap_create(&heap_desc, "MyHeap", HEAP_SIZE, H_FIFO);
if (ret) {
fprintf(stderr, "Main: rt_heap_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务
ret = rt_task_create(&task_desc, "HeapTask", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Main: rt_task_create %s\n", strerror(-ret));
rt_heap_delete(&heap_desc);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task_desc, &heap_task, NULL);
// 等待任务完成
rt_task_join(&task_desc);
// 清理
rt_heap_delete(&heap_desc);
rt_task_delete(&task_desc);
return EXIT_SUCCESS;
}