DSP_TMS320F28335_队列与栈

说起队列和栈,链表+动态内存分配的方式,是比较常见的方式,最近项目下需要在dsp上面使用队列和栈两种数据结构,所有就使用链表+动态内存分配的方式实现了一下,但是调试的过程中发现运行的时候总是在动态内存分配的位置出bug,动态内存分配malloc总是分配失败,返回空指针,尝试修改cmd的配置后,也仍然没有解决问题。思来想去还是用数组的方式来实现队列和栈,结果性能出奇的稳定,所以本博客记录一下用数组实现队列和栈的代码。

队列

queue.h

#ifndef USERPROGRAM_QUEUE_QUEUE_H_
#define USERPROGRAM_QUEUE_QUEUE_H_#include <main.h>#define QUEUE_MAX_SIZE 500
/*--------------- 单个Uint16队列 ---------------*/
typedef struct _queue{int size;int front;int rear;Uint16 data[QUEUE_MAX_SIZE];
} queue;void queue_init(queue *q);
int enqueue(queue *q, Uint16 value);
int dequeue(queue *q, Uint16 *value);
int is_queue_empty(queue *q);extern queue scib_rx_queue;
extern queue scib_tx_queue;#endif /* USERPROGRAM_QUEUE_QUEUE_H_ */

queue.c 

#include <queue.h>queue scib_rx_queue;
queue scib_tx_queue;void queue_init(queue *q){q->size     = 0;q->front    = 0;q->rear     = -1;
}int enqueue(queue *q, Uint16 value){if(q->size == QUEUE_MAX_SIZE){return 0;}q->rear++;q->data[q->rear] = value;q->size++;return 1;}int dequeue(queue *q, Uint16 *value){if(q->size == 0){return 0;}*value = q->data[q->front];q->front++;q->size--;// 初始化 如果是实时系统里面一直用队列,初始化非常的关键if(q->size==0){q->front    = 0;q->rear     = -1;}return 1;
}int is_queue_empty(queue *q){return (q->size==0);
}

 

stack.h 

#ifndef USERPROGRAM_STACK_STACK_H_
#define USERPROGRAM_STACK_STACK_H_#include <main.h>#define STACK_MAX_SIZE 500typedef struct _stack
{float data[STACK_MAX_SIZE]; //数组建立顺序栈int top;//栈中元素个数
}stack;extern stack input_compute_stack;
extern stack output_compute_stack;void    stack_init(stack* s);
int     is_stack_empty(stack* s);
int     enstack(stack* s, float value);
int     destack(stack* s, float * value);
void    clearstack(stack* s);float   computeformula(stack *s, float* constant_value, float* ch_value, Uint16* compute_rule, int N, int * ret);#pragma CODE_SECTION(computeformula,"ramfuncs");#endif /* USERPROGRAM_STACK_STACK_H_ */

stack.c 

#include <stack.h>stack input_compute_stack;
stack output_compute_stack;void stack_init(stack* s){s->top = 0;
}int is_stack_empty(stack* s){return (s->top==0);
}int enstack(stack* s, float value){if (s->top == STACK_MAX_SIZE){return 0;}else{s->data[s->top] = value;s->top++;return 1;}
}int destack(stack* s, float * value)
{if (s->top == 0){return 0;}else{s->top--;*value = s->data[s->top];return 1;}
}void clearstack(stack* s){s->top = 0;
}float computeformula(stack *s, float* constant_value, float* ch_value, Uint16* compute_rule, int N, int * ret){int i;float result = 0;float operator1 = 0;float operator2 = 0;int stack_pop_ret1 = 1;int stack_pop_ret2 = 1;int stack_push_ret = 1;for(i = 0; i < N; i++){switch (compute_rule[i]){case ADD:stack_pop_ret1  = destack(s, &operator1);stack_pop_ret2  = destack(s, &operator2);result          = operator2 + operator1;stack_push_ret  = enstack(s, result);if(stack_pop_ret1==0 || stack_pop_ret2==0 || stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case SUBSTRACT:stack_pop_ret1  = destack(s, &operator1);stack_pop_ret2  = destack(s, &operator2);result          = operator2 - operator1;stack_push_ret  = enstack(s, result);if(stack_pop_ret1==0 || stack_pop_ret2==0 || stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case MULTIPLY:stack_pop_ret1  = destack(s, &operator1);stack_pop_ret2  = destack(s, &operator2);result          = operator2 * operator1;stack_push_ret  = enstack(s, result);if(stack_pop_ret1==0 || stack_pop_ret2==0 || stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case DIVIDE:stack_pop_ret1  = destack(s, &operator1);stack_pop_ret2  = destack(s, &operator2);if(stack_pop_ret1==0 || stack_pop_ret2==0 || operator1 == 0){*ret = 0;clearstack(s);return 0;}else{result          = operator2 / operator1;stack_push_ret  = enstack(s, result);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}}break;case CH1_P:stack_push_ret  = enstack(s, ch_value[0]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CH2_P:stack_push_ret  = enstack(s, ch_value[1]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CH3_P:stack_push_ret  = enstack(s, ch_value[2]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CH4_P:stack_push_ret  = enstack(s, ch_value[3]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CH5_P:stack_push_ret  = enstack(s, ch_value[4]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CH1_N:stack_push_ret  = enstack(s, -ch_value[0]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CH2_N:stack_push_ret  = enstack(s, -ch_value[1]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CH3_N:stack_push_ret  = enstack(s, -ch_value[2]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CH4_N:stack_push_ret  = enstack(s, -ch_value[3]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CH5_N:stack_push_ret  = enstack(s, -ch_value[4]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CONSTANT1:stack_push_ret  = enstack(s, constant_value[0]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CONSTANT2:stack_push_ret  = enstack(s, constant_value[1]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CONSTANT3:stack_push_ret  = enstack(s, constant_value[2]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CONSTANT4:stack_push_ret  = enstack(s, constant_value[3]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;case CONSTANT5:stack_push_ret  = enstack(s, constant_value[4]);if(stack_push_ret==0){*ret = 0;clearstack(s);return 0;}break;default:break;}}clearstack(s);*ret = 1;return result;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA取消git对项目的版本控制

前言 前几天新建项目的时候不小心选了个git仓库&#xff0c;导致这个测试项目一直被git管理着。 解决办法 1 右键项目 选择打开资源目录 2 删除.git文件 把目录下的.git文件删掉 3 删除idea中的git管理 删除完.git文件后&#xff0c;进入idea&#xff0c;右下角会有这样的提…

广域网加速的作用:企业为什么需要广域网加速?

由于局域网与广域网之间巨大的带宽鸿沟&#xff0c;通过增加带宽来满足膨胀的流量需求是不切实际的。 并且广域网带宽成本较高&#xff0c;增加广域网带宽对任何企业都意味着巨大的成本负担。这些使得控制 管理广域网带宽使用成为必需。 企业为什么要加速广域网? 对重要的企…

轻量封装WebGPU渲染系统示例<12>- 基础3D对象实体(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/PrimitiveEntityTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔…

vue3-video-play视频播放组件

安装&#xff1a; npm i vue3-video-play --save使用说明&#xff1a; https://codelife.cc/vue3-video-play/guide/install.html

2023年05月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 请选择&#xff0c;下面代码运行之后的结果是&#xff1f;&#xff08; &#xff09; a 2 b 4 try:c a * bprint(c…

数据结构:AVL树的实现和全部图解

文章目录 为什么要有AVL树什么是AVL树AVL树的实现元素的插入平衡因子的更新AVL树的旋转 AVL树的检查完整实现 本篇总结的是AVL树中的全部内容&#xff0c;配有详细的图解过程 为什么要有AVL树 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;在其文档介绍中发现…

白盒测试用例的设计(图文讲解,超详细)

正文 语句覆盖&#xff1a;每条语句至少执行一次。判定覆盖&#xff1a;每个判定的所有可能结果至少出现一次。&#xff08;又称“分支覆盖”&#xff09;条件覆盖&#xff1a;每个条件的所有可能结果至少执行一次。判定/条件覆盖&#xff1a;一个判定中的每个条件的所有可能结…

开源七轴myArm协作机械臂正逆运动学技术讲解

引言&#xff1a; 在本文中&#xff0c;我们将深入探讨机器人学的两个核心概念&#xff1a;正运动学和逆运动学。这两个概念是理解和控制机械臂运动的基础。通过一个具体的7轴机械臂实例&#xff0c;我们将详细介绍如何计算机械臂的正运动学和逆运动学。我们首先会解释正运动学…

asp.net docker-compose添加sql server

打开docker-compose.yml 添加 sqldata:image: mysql:8.1.0 打开docker-compose.override.yml 添加 sqldata:environment:- MYSQL_ROOT_PASSWORDPasswordports:- "8080:8080"volumes:- killsb-one-sqldata:/etc/mysql/conf.d 在docker里面就有了sql server容器镜像…

uniapp 微信小程序 uni-file-picker上传图片报错 chooseAndUploadFile

这个问题真的很搞&#xff0c; 原因是微信开发者工具更新了&#xff0c;导致图片上传问题。 解决方法&#xff1a; 将微信开发者工具的基础库改为2.33.0一下即可。 在微信开发者工具详情 - 本地设置中&#xff08;记得点击‘推送’按钮&#xff09;&#xff1a;

【内功修炼】详解函数栈帧的创建和销毁

文章目录 1. 什么是函数栈帧2. 理解函数栈帧能解决什么问题呢&#xff1f;3. 函数栈帧的创建和销毁解析3.1 什么是栈&#xff1f;3.2 认识相关寄存器和汇编指令常见寄存器常用汇编指令 3.3 详解函数栈帧的创建和销毁3.3.1 函数的调用堆栈&#xff08;main函数也是被其它函数调用…

python用cv2画图(line, rectangle, text等)

Python做图像图形研究的时候&#xff0c;通常需要画很多辅助几何形状&#xff08;比如bounding box等&#xff09;。基于opencv的几何图形绘制具有易用性&#xff0c;而且天然能和numpy数组交互。 本文总结了几种常用的cv2画几何图形的方法&#xff0c;当一个简易的手册使用&a…

uniapp开发H5及app监听返回事件(以及监听不到的处理方法)

1.使用页面事件onBackPress事件监听返回键 onBackPress(e) {//e.from backbutton 说明如果点击的是物理返回键或导航栏的返回键就进行以下操作if (e.from backbutton) {if (遮罩层是否隐藏) {//如果没隐藏//这里写让遮罩层隐藏的代码} else {//如果隐藏了//这里就写返回上一…

计算机网络(59)

1. OSI 的七层模型分别是&#xff1f;各自的功能是什么&#xff1f; 2. 为什么需要三次握手&#xff1f;两次不行&#xff1f; 3. 为什么需要四次挥手&#xff1f;三次不行&#xff1f; 4. TCP与UDP有哪些区别&#xff1f;各自应用场景&#xff1f; 5. HTTP1.0&#xff0c;1.1&…

Go 定时任务实现

定时任务简介 定时任务是指按照预定的时间间隔或特定时间点自动执行的计划任务或操作。这些任务通常用于自动化重复性的工作&#xff0c;以减轻人工操作的负担&#xff0c;提高效率。在计算机编程和应用程序开发中&#xff0c;定时任务是一种常见的编程模式&#xff0c;用于周…

大数据疫情分析及可视化系统 计算机竞赛

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据疫…

智慧社区大屏:连接社区生活的数字桥梁

随着科技的不断发展&#xff0c;智慧社区已经不再只是未来的概念&#xff0c;它已经在我们的眼前悄然崭露头角。智慧社区是一种基于数字技术的社区管理和生活方式&#xff0c;旨在提高社区的安全性、便利性和生活质量。而在这个数字化的社区中&#xff0c;智慧社区大屏起到了连…

Spire.Office for .NET 8.10.2 同步更新-Crk

Spire.Office for .NET是 E-iceblue 提供的企业级 Office .NET API 的组合。它包括Spire.Doc、Spire.XLS、Spire.Spreadsheet、Spire.Presentation、Spire.PDF、Spire.DataExport、Spire.OfficeViewer、Spire.PDFViewer、Spire.DocViewer、Spire.Barcode和Spire.Email。Spire.O…

一文深入搞懂ARM处理器架构

1、嵌入式处理器基础 典型的微处理器由控制单元、程序计数器&#xff08;PC&#xff09;、指令寄存器&#xff08;IR&#xff09;、数据通道、存储器等组成 。 指令执行过程一般分为&#xff1a; 取指&#xff1a; 从存储器中获得下一条执行的指令读入指令寄存器&#xff1…

对“Fork”做一个技术方面的简介

使用过 GitHub 的人大多知道它上面有个“Fork”的功能&#xff0c;用来将某个仓库克隆到你的账户之下&#xff0c;从而可以对其进行修改、衍生&#xff0c;也可以比较方便的将你的修改推回到原来的仓库&#xff08;所谓的上游&#xff09;。 随着 GitHub 的流行&#xff0c;我…