OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3125|回复: 7

UCOSIII 使用三角函数就进入硬件中断

[复制链接]

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-9-5 12:28:53 | 显示全部楼层 |阅读模式
29金钱

开始任务函数里面把其他任务都屏蔽了,只留下了Led0的任务,

led0任务里面就循环一个函数,这个函数里面,用到三角函数就会进去 HardFault_Handler 错误中断

也不是一到使用的地方就跳转到 HardFault_Handler,有时候是循环到第五次的时候就跳到HardFault_Handler中断。。。

把任务栈都加大了很多了 4096 * 4 字节了,启动文件的堆栈也加大了,还是会这样。

反正用这个没问题    Dis = fabs(WHEEL_BASE/0) - WHEEL_TRACK/2.0f;        //距离为正数,

换成这个就有问题了    Dis = fabs(WHEEL_BASE/tan(Angle)) - WHEEL_TRACK/2.0f;        //距离为正数

1.png

2.png

3.png


请问下有什么建议吗,我实在是不知道咋回事了。

求大神帮助哇。。。

最佳答案

查看完整内容[请看2#楼]

按照一个大佬的提示,替换了os_cpu_c.c 文件里面的*OSTaskStkInit 函数 然后再替换了os_cpu_a.asm文件中的PendSVHandler 暂时好像就不出现错误中断的情况了,对ucos内核这些还没仔细研究过,还不太明白咋回事。
茵茵猪头
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2019-9-5 12:28:54 | 显示全部楼层
按照一个大佬的提示,替换了os_cpu_c.c 文件里面的*OSTaskStkInit 函数

  1. CPU_STK  *OSTaskStkInit (OS_TASK_PTR    p_task,
  2.                          void          *p_arg,
  3.                          CPU_STK       *p_stk_base,
  4.                          CPU_STK       *p_stk_limit,
  5.                          CPU_STK_SIZE   stk_size,
  6.                          OS_OPT         opt)
  7. {
  8.     CPU_STK  *p_stk;


  9.     (void)opt;                                              /* Prevent compiler warning                               */

  10.     p_stk = &p_stk_base[stk_size];                          /* Load stack pointer                                     */
  11.                                                                 /* Align the stack to 8-bytes.                            */
  12.     p_stk = (CPU_STK *)((CPU_STK)(p_stk) & 0xFFFFFFF8);
  13.                                                             /* Registers stacked as if auto-saved on exception        */
  14.   
  15.         *--p_stk = (CPU_STK)0x01000000u;                        /* xPSR                                                   */
  16.     *--p_stk = (CPU_STK)p_task;                             /* Entry Point                                            */
  17.     *--p_stk = (CPU_STK)OS_TaskReturn;                      /* R14 (LR)                                               */
  18.     *--p_stk = (CPU_STK)0x12121212u;                        /* R12                                                    */
  19.     *--p_stk = (CPU_STK)0x03030303u;                        /* R3                                                     */
  20.     *--p_stk = (CPU_STK)0x02020202u;                        /* R2                                                     */
  21.     *--p_stk = (CPU_STK)p_stk_limit;                        /* R1                                                     */
  22.     *--p_stk = (CPU_STK)p_arg;                              /* R0 : argument                                          */
  23.                                                             /* Remaining registers saved on process stack             */
  24.     *--p_stk = (CPU_STK)0x11111111u;                        /* R11                                                    */
  25.     *--p_stk = (CPU_STK)0x10101010u;                        /* R10                                                    */
  26.     *--p_stk = (CPU_STK)0x09090909u;                        /* R9                                                     */
  27.     *--p_stk = (CPU_STK)0x08080808u;                        /* R8                                                     */
  28.     *--p_stk = (CPU_STK)0x07070707u;                        /* R7                                                     */
  29.     *--p_stk = (CPU_STK)0x06060606u;                        /* R6                                                     */
  30.     *--p_stk = (CPU_STK)0x05050505u;                        /* R5                                                     */
  31.     *--p_stk = (CPU_STK)0x04040404u;                        /* R4                                                     */

  32.     *--p_stk = (CPU_STK)0xFFFFFFFDUL;   
  33.        
  34.         return (p_stk);
  35. }
复制代码


然后再替换了os_cpu_a.asm文件中的PendSVHandler

  1. OS_CPU_PendSVHandler
  2.     CPSID   I                                                   ; Prevent interruption during context switch
  3.     MRS     R0, PSP                                             ; PSP is process stack pointer
  4.     CBZ     R0, OS_CPU_PendSVHandler_nosave                     ; Skip register save the first time

  5.     TST      LR, #0x10                          
  6.         IT       EQ
  7.         VSTMDBEQ R0!, {S16-S31}
  8.    
  9.         MOV      R3, LR        
  10.         STMDB    R0!,{R3-R11}                       

  11.     LDR     R1, =OSTCBCurPtr                                    ; OSTCBCurPtr->OSTCBStkPtr = SP;
  12.     LDR     R1, [R1]
  13.     STR     R0, [R1]                                            ; R0 is SP of process being switched out

  14.                                                                 ; At this point, entire context of process has been saved
  15. OS_CPU_PendSVHandler_nosave
  16.     PUSH    {R14}                                               ; Save LR exc_return value
  17.     LDR     R0, =OSTaskSwHook                                   ; OSTaskSwHook();
  18.     BLX     R0
  19.     POP     {R14}

  20.     LDR     R0, =OSPrioCur                                      ; OSPrioCur   = OSPrioHighRdy;
  21.     LDR     R1, =OSPrioHighRdy
  22.     LDRB    R2, [R1]
  23.     STRB    R2, [R0]

  24.     LDR     R0, =OSTCBCurPtr                                    ; OSTCBCurPtr = OSTCBHighRdyPtr;
  25.     LDR     R1, =OSTCBHighRdyPtr
  26.     LDR     R2, [R1]
  27.     STR     R2, [R0]

  28.     LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdyPtr->StkPtr;


  29.     LDMIA    R0!,{R3-R11}                       
  30.         MOV      LR, R3
  31.          
  32.         TST      LR, #0x10                          
  33.         IT       EQ
  34.         VLDMIAEQ R0!, {S16-S31}                
  35.    
  36.     MSR     PSP, R0                                             ; Load PSP with new process SP
  37.    
  38.     CPSIE   I
  39.     BX      LR                                                  ; Exception return will restore remaining context

  40.     END
复制代码


暂时好像就不出现错误中断的情况了,对ucos内核这些还没仔细研究过,还不太明白咋回事。

茵茵猪头
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2019-9-5 12:31:14 | 显示全部楼层
包括使用 DSP库函数arm_sin_f32  也会这样
茵茵猪头
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2019-9-5 13:19:23 | 显示全部楼层
有大佬指教一下吗
茵茵猪头
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2019-9-5 17:31:35 | 显示全部楼层
浮点运算也加了,DSP也加了,就是移植错误中断,心态爆炸
茵茵猪头
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-9-6 02:33:45 | 显示全部楼层
任务堆栈32字节对齐试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2019-9-6 09:26:14 | 显示全部楼层
原子哥,我这儿都是32字节对齐的了,系统的堆栈也加大了,DSP库的移植就几个过程反反复复弄了,应该也没啥问题,就是一进sin相关函数就错误中断,要崩溃了

茵茵猪头
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2019-9-6 12:36:45 | 显示全部楼层
茵茵猪头
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 12:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表