• DSP_TMS320F28335_队列与栈


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

    参考链接:数据结构:栈和队列(Stack & Queue)【详解】-CSDN博客

    参考链接:c语言底层数组的方式实现栈和队列_c语言树和队列的底层实现是什么-CSDN博客

    目录

    1  队列

    2 栈


    1  队列

    queue.h

    1. #ifndef USERPROGRAM_QUEUE_QUEUE_H_
    2. #define USERPROGRAM_QUEUE_QUEUE_H_
    3. #include
    4. #define QUEUE_MAX_SIZE 500
    5. /*--------------- 单个Uint16队列 ---------------*/
    6. typedef struct _queue{
    7. int size;
    8. int front;
    9. int rear;
    10. Uint16 data[QUEUE_MAX_SIZE];
    11. } queue;
    12. void queue_init(queue *q);
    13. int enqueue(queue *q, Uint16 value);
    14. int dequeue(queue *q, Uint16 *value);
    15. int is_queue_empty(queue *q);
    16. extern queue scib_rx_queue;
    17. extern queue scib_tx_queue;
    18. #endif /* USERPROGRAM_QUEUE_QUEUE_H_ */

    queue.c 

    1. #include
    2. queue scib_rx_queue;
    3. queue scib_tx_queue;
    4. void queue_init(queue *q){
    5. q->size = 0;
    6. q->front = 0;
    7. q->rear = -1;
    8. }
    9. int enqueue(queue *q, Uint16 value){
    10. if(q->size == QUEUE_MAX_SIZE){
    11. return 0;
    12. }
    13. q->rear++;
    14. q->data[q->rear] = value;
    15. q->size++;
    16. return 1;
    17. }
    18. int dequeue(queue *q, Uint16 *value){
    19. if(q->size == 0){
    20. return 0;
    21. }
    22. *value = q->data[q->front];
    23. q->front++;
    24. q->size--;
    25. // 初始化 如果是实时系统里面一直用队列,初始化非常的关键
    26. if(q->size==0){
    27. q->front = 0;
    28. q->rear = -1;
    29. }
    30. return 1;
    31. }
    32. int is_queue_empty(queue *q){
    33. return (q->size==0);
    34. }

    此部分内容,用于支撑博客DSP_TMS320F28335_优秀的串口通信框架_28335串口发送多个数据-CSDN博客的小队列通信方法。具体怎么应用上述的“以数组为底层的队列”,也可以通过看这篇博客去感受。

    2 栈

    stack.h 

    1. #ifndef USERPROGRAM_STACK_STACK_H_
    2. #define USERPROGRAM_STACK_STACK_H_
    3. #include
    4. #define STACK_MAX_SIZE 500
    5. typedef struct _stack
    6. {
    7. float data[STACK_MAX_SIZE]; //数组建立顺序栈
    8. int top;//栈中元素个数
    9. }stack;
    10. extern stack input_compute_stack;
    11. extern stack output_compute_stack;
    12. void stack_init(stack* s);
    13. int is_stack_empty(stack* s);
    14. int enstack(stack* s, float value);
    15. int destack(stack* s, float * value);
    16. void clearstack(stack* s);
    17. float computeformula(stack *s, float* constant_value, float* ch_value, Uint16* compute_rule, int N, int * ret);
    18. #pragma CODE_SECTION(computeformula,"ramfuncs");
    19. #endif /* USERPROGRAM_STACK_STACK_H_ */

    stack.c 

    1. #include
    2. stack input_compute_stack;
    3. stack output_compute_stack;
    4. void stack_init(stack* s){
    5. s->top = 0;
    6. }
    7. int is_stack_empty(stack* s){
    8. return (s->top==0);
    9. }
    10. int enstack(stack* s, float value){
    11. if (s->top == STACK_MAX_SIZE)
    12. {
    13. return 0;
    14. }
    15. else
    16. {
    17. s->data[s->top] = value;
    18. s->top++;
    19. return 1;
    20. }
    21. }
    22. int destack(stack* s, float * value)
    23. {
    24. if (s->top == 0)
    25. {
    26. return 0;
    27. }
    28. else
    29. {
    30. s->top--;
    31. *value = s->data[s->top];
    32. return 1;
    33. }
    34. }
    35. void clearstack(stack* s){
    36. s->top = 0;
    37. }

    下面备份一个栈的应用,用于后缀表达式,计算四则运算公式

    1. float computeformula(stack *s, float* constant_value, float* ch_value, Uint16* compute_rule, int N, int * ret){
    2. int i;
    3. float result = 0;
    4. float operator1 = 0;
    5. float operator2 = 0;
    6. int stack_pop_ret1 = 1;
    7. int stack_pop_ret2 = 1;
    8. int stack_push_ret = 1;
    9. for(i = 0; i < N; i++){
    10. switch (compute_rule[i]){
    11. case ADD:
    12. stack_pop_ret1 = destack(s, &operator1);
    13. stack_pop_ret2 = destack(s, &operator2);
    14. result = operator2 + operator1;
    15. stack_push_ret = enstack(s, result);
    16. if(stack_pop_ret1==0 || stack_pop_ret2==0 || stack_push_ret==0){
    17. *ret = 0;
    18. clearstack(s);
    19. return 0;
    20. }
    21. break;
    22. case SUBSTRACT:
    23. stack_pop_ret1 = destack(s, &operator1);
    24. stack_pop_ret2 = destack(s, &operator2);
    25. result = operator2 - operator1;
    26. stack_push_ret = enstack(s, result);
    27. if(stack_pop_ret1==0 || stack_pop_ret2==0 || stack_push_ret==0){
    28. *ret = 0;
    29. clearstack(s);
    30. return 0;
    31. }
    32. break;
    33. case MULTIPLY:
    34. stack_pop_ret1 = destack(s, &operator1);
    35. stack_pop_ret2 = destack(s, &operator2);
    36. result = operator2 * operator1;
    37. stack_push_ret = enstack(s, result);
    38. if(stack_pop_ret1==0 || stack_pop_ret2==0 || stack_push_ret==0){
    39. *ret = 0;
    40. clearstack(s);
    41. return 0;
    42. }
    43. break;
    44. case DIVIDE:
    45. stack_pop_ret1 = destack(s, &operator1);
    46. stack_pop_ret2 = destack(s, &operator2);
    47. if(stack_pop_ret1==0 || stack_pop_ret2==0 || operator1 == 0){
    48. *ret = 0;
    49. clearstack(s);
    50. return 0;
    51. }else{
    52. result = operator2 / operator1;
    53. stack_push_ret = enstack(s, result);
    54. if(stack_push_ret==0){
    55. *ret = 0;
    56. clearstack(s);
    57. return 0;
    58. }
    59. }
    60. break;
    61. case CH1_P:
    62. stack_push_ret = enstack(s, ch_value[0]);
    63. if(stack_push_ret==0){
    64. *ret = 0;
    65. clearstack(s);
    66. return 0;
    67. }
    68. break;
    69. case CH2_P:
    70. stack_push_ret = enstack(s, ch_value[1]);
    71. if(stack_push_ret==0){
    72. *ret = 0;
    73. clearstack(s);
    74. return 0;
    75. }
    76. break;
    77. case CH3_P:
    78. stack_push_ret = enstack(s, ch_value[2]);
    79. if(stack_push_ret==0){
    80. *ret = 0;
    81. clearstack(s);
    82. return 0;
    83. }
    84. break;
    85. case CH4_P:
    86. stack_push_ret = enstack(s, ch_value[3]);
    87. if(stack_push_ret==0){
    88. *ret = 0;
    89. clearstack(s);
    90. return 0;
    91. }
    92. break;
    93. case CH5_P:
    94. stack_push_ret = enstack(s, ch_value[4]);
    95. if(stack_push_ret==0){
    96. *ret = 0;
    97. clearstack(s);
    98. return 0;
    99. }
    100. break;
    101. case CH1_N:
    102. stack_push_ret = enstack(s, -ch_value[0]);
    103. if(stack_push_ret==0){
    104. *ret = 0;
    105. clearstack(s);
    106. return 0;
    107. }
    108. break;
    109. case CH2_N:
    110. stack_push_ret = enstack(s, -ch_value[1]);
    111. if(stack_push_ret==0){
    112. *ret = 0;
    113. clearstack(s);
    114. return 0;
    115. }
    116. break;
    117. case CH3_N:
    118. stack_push_ret = enstack(s, -ch_value[2]);
    119. if(stack_push_ret==0){
    120. *ret = 0;
    121. clearstack(s);
    122. return 0;
    123. }
    124. break;
    125. case CH4_N:
    126. stack_push_ret = enstack(s, -ch_value[3]);
    127. if(stack_push_ret==0){
    128. *ret = 0;
    129. clearstack(s);
    130. return 0;
    131. }
    132. break;
    133. case CH5_N:
    134. stack_push_ret = enstack(s, -ch_value[4]);
    135. if(stack_push_ret==0){
    136. *ret = 0;
    137. clearstack(s);
    138. return 0;
    139. }
    140. break;
    141. case CONSTANT1:
    142. stack_push_ret = enstack(s, constant_value[0]);
    143. if(stack_push_ret==0){
    144. *ret = 0;
    145. clearstack(s);
    146. return 0;
    147. }
    148. break;
    149. case CONSTANT2:
    150. stack_push_ret = enstack(s, constant_value[1]);
    151. if(stack_push_ret==0){
    152. *ret = 0;
    153. clearstack(s);
    154. return 0;
    155. }
    156. break;
    157. case CONSTANT3:
    158. stack_push_ret = enstack(s, constant_value[2]);
    159. if(stack_push_ret==0){
    160. *ret = 0;
    161. clearstack(s);
    162. return 0;
    163. }
    164. break;
    165. case CONSTANT4:
    166. stack_push_ret = enstack(s, constant_value[3]);
    167. if(stack_push_ret==0){
    168. *ret = 0;
    169. clearstack(s);
    170. return 0;
    171. }
    172. break;
    173. case CONSTANT5:
    174. stack_push_ret = enstack(s, constant_value[4]);
    175. if(stack_push_ret==0){
    176. *ret = 0;
    177. clearstack(s);
    178. return 0;
    179. }
    180. break;
    181. default:
    182. break;
    183. }
    184. }
    185. clearstack(s);
    186. *ret = 1;
    187. return result;
    188. }

    最后愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。 

  • 相关阅读:
    easyexcel升级3.3.4失败的经历
    第十三天到达终点数字
    JavaScript的综合案例
    C#界面里的AllowDrop属性、DragDrop和DragEnter事件
    微前端学习
    Reactive响应式WebClient负载调用微服务接口封装,自行编写类OpenFeign的Reactive实现
    加密的重要性,MySQL加密有哪些好处?
    P18 JMenuBar菜单栏
    发布自己的npm包注意事项
    Android Studio下运行java main 方法
  • 原文地址:https://blog.csdn.net/heqiunong/article/details/134260764