OpenEdv-开源电子网

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

移植freeRTOS中的问题

[复制链接]

78

主题

182

帖子

0

精华

高级会员

Rank: 4

积分
533
金钱
533
注册时间
2013-7-4
在线时间
11 小时
发表于 2014-4-1 17:58:50 | 显示全部楼层 |阅读模式
现在在移植freeRTOS,卡在了sdio读取过程

程序会一直卡在SD_WaitReadOperation的
  while(((SDIO->STA & SDIO_FLAG_RXACT)) && (timeout > 0))
  {
    timeout--;  
  }
应该是标志位没清除,我检查SDIO的中断进了,DMA的中断没进所以没有清除标志位,

这是我的中断初始化
void NVIC_Configurationsd(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure the NVIC Preemption Priority Bits */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  
}



这是我的中断
void SDIO_IRQHandler(void)
{
vTaskEnterCritical();
        HAL_NVIC_ClearPendingIRQ(SDIO_IRQ_ISR);
  SD_ProcessIRQSrc();
vTaskExitCritical();
}

void SD_SDIO_DMA_IRQHANDLER(void)
{
vTaskEnterCritical();
        HAL_NVIC_ClearPendingIRQ(SIDO_DMA_IRQn_ISR);
  SD_ProcessDMAIRQ();
vTaskExitCritical();
}

按理来说优先级0-7是不会被rtos给处理的才对,就是奇怪为什么DMA的中断不会进,造成传输没有完成
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-1 20:14:04 | 显示全部楼层
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

78

主题

182

帖子

0

精华

高级会员

Rank: 4

积分
533
金钱
533
注册时间
2013-7-4
在线时间
11 小时
 楼主| 发表于 2014-4-3 14:52:06 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
找到真正的原因了.......我启用了stm32的0x10000000的64k内存后就会出现这种原因.....省出点内存关掉就好了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-3 16:05:10 | 显示全部楼层
回复【3楼】jimmjimm:
---------------------------------
你改了启动代码还是MDK的设置,我试过改MDK设置不行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

78

主题

182

帖子

0

精华

高级会员

Rank: 4

积分
533
金钱
533
注册时间
2013-7-4
在线时间
11 小时
 楼主| 发表于 2014-4-3 16:31:29 | 显示全部楼层
回复【4楼】 Badu_Space :
---------------------------------


我把IRAM2前面勾掉就可以用了,看了手册的确这块内存跟前两块是不一样的,下次有时间再找找原因
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-4 13:16:05 | 显示全部楼层
回复【5楼】jimmjimm:
---------------------------------
你设置了IRAM2?????
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

78

主题

182

帖子

0

精华

高级会员

Rank: 4

积分
533
金钱
533
注册时间
2013-7-4
在线时间
11 小时
 楼主| 发表于 2014-4-8 15:03:33 | 显示全部楼层
之前设置了,就出了那个问题,取消掉就没问题了
回复 支持 反对

使用道具 举报

78

主题

182

帖子

0

精华

高级会员

Rank: 4

积分
533
金钱
533
注册时间
2013-7-4
在线时间
11 小时
 楼主| 发表于 2014-4-8 15:10:22 | 显示全部楼层
回复【6楼】Badu_Space:
---------------------------------
我的是407的,看了下10000000开始的64k只能通过cpu访问不能通过外设(DMA)访问,所以才出现了这个问题,要修改分散加载文件才行,不过没时间搞,还在研究freertos怎么弄比较好....
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-8 16:48:10 | 显示全部楼层
回复【8楼】jimmjimm:
---------------------------------
呵呵,弄好就好,恭喜

弄好分享下移植经验什么的,好让我们这些菜鸟学习以下,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

78

主题

182

帖子

0

精华

高级会员

Rank: 4

积分
533
金钱
533
注册时间
2013-7-4
在线时间
11 小时
 楼主| 发表于 2014-4-14 14:52:37 | 显示全部楼层
回复【9楼】Badu_Space:
---------------------------------
=-=我也是菜鸟呀
现在就知道要定义
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler endSV_Handler
#define xPortSysTickHandler SysTick_Handler
然后中断全部都要改成NVIC_GROUP_4(不使用SubPriority)
初始化比较耗时的话,要先createtask再初始化
其他的都跟网上说的差不多

现在能跑,但是还有bug

stm32进入硬件错误的话,可以改写成

static void HardFault_Handler( void ) __attribute__( ( naked ) );
static void HardFault_Handler(void)
{
    __asm volatile
    (
        " tst lr, #4                                                \n"
        " ite eq                                                    \n"
        " mrseq r0, msp                                             \n"
        " mrsne r0, psp                                             \n"
        " ldr r1, [r0, #24]                                         \n"
        " ldr r2, handler2_address_const                            \n"
        " bx r2                                                     \n"
        " handler2_address_const: .word prvGetRegistersFromStack    \n"
    );
}

void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
{
/* These are volatile to try and prevent the compiler/linker optimising them
away as the variables never actually get used.  If the debugger won't show the
values of the variables, make them global my moving their declaration outside
of this function. */
volatile uint32_t r0;
volatile uint32_t r1;
volatile uint32_t r2;
volatile uint32_t r3;
volatile uint32_t r12;
volatile uint32_t lr; /* Link register. */
volatile uint32_t pc; /* rogram counter. */
volatile uint32_t psr;/* rogram status register. */

    r0 = pulFaultStackAddress[ 0 ];
    r1 = pulFaultStackAddress[ 1 ];
    r2 = pulFaultStackAddress[ 2 ];
    r3 = pulFaultStackAddress[ 3 ];

    r12 = pulFaultStackAddress[ 4 ];
    lr = pulFaultStackAddress[ 5 ];
    pc = pulFaultStackAddress[ 6 ];
    psr = pulFaultStackAddress[ 7 ];

    /* When the following line is hit, the variables contain the register values. */
    for( ;; );
}

这样会比较好debug

其他还在摸索
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-14 15:03:11 | 显示全部楼层
回复【10楼】jimmjimm:
---------------------------------
不错,我还没看是ucos呢
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 17:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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