搜索
bottom↓
回复: 37

stm32看门狗时间不够用,怎么处理

[复制链接]

出0入0汤圆

发表于 2017-8-12 08:47:00 | 显示全部楼层 |阅读模式
本帖最后由 蜗牛蜗牛 于 2017-8-12 08:56 编辑

现在情况是这样的,主程序时间50秒左右,期间开启了定时器定时器时间是20ms ,一直是在定时器中喂狗 喂狗值是(4.625),也就是1秒,现在发现程序运行几天还会莫名其妙的死机(我猜测是主程序死了,但是定时器一直在运行所以单片机不复位),
按复位键就好另外主程序里面还有个小程序,小程序运行时间大约是1分钟,不过主程序的小程序,满足条件后才触发,一般也不触发,运行1年也就触发几次 ,
现在我想解决方法:主程序到处喂狗,直到满足不使单片机复位位置为止,
还有没有好的,喂狗方法,?定时器中断喂狗好像不行,
星期一要是没有好的解决方案,就按喂狗时间5折到处喂狗了

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-8-12 08:47:01 | 显示全部楼层
狗设置最长时间,然后打5折,喂狗、

出0入54汤圆

发表于 2017-8-12 08:48:54 | 显示全部楼层
喂狗的大忌之一就是中断中喂狗。

出0入0汤圆

 楼主| 发表于 2017-8-12 08:49:05 | 显示全部楼层
补充,stm32看门狗用的时候应该注意什么,是不是在中断喂狗不对啊?

出0入0汤圆

 楼主| 发表于 2017-8-12 08:50:33 | 显示全部楼层
lusson 发表于 2017-8-12 08:48
喂狗的大忌之一就是中断中喂狗。

收到

出0入0汤圆

发表于 2017-8-12 08:50:33 | 显示全部楼层
喂狗不是应该在主循环里面吗?

出0入0汤圆

 楼主| 发表于 2017-8-12 08:51:25 | 显示全部楼层
lfgc 发表于 2017-8-12 08:49
狗设置最长时间,然后打5折,喂狗、

目的是为了稳妥,然后还不至于喂狗次数过多,是这个意思吧?

出0入0汤圆

 楼主| 发表于 2017-8-12 08:52:55 | 显示全部楼层
ljy99731 发表于 2017-8-12 08:50
喂狗不是应该在主循环里面吗?

主循环时间太长,最短40秒,最长时候1分40秒,所以想到用定时器,结果死机了狗也不管用

出0入54汤圆

发表于 2017-8-12 08:55:22 | 显示全部楼层
蜗牛蜗牛 发表于 2017-8-12 08:52
主循环时间太长,最短40秒,最长时候1分40秒,所以想到用定时器,结果死机了狗也不管用 ...

如果没有用操作系统,把主任务分割使用状态机
你这最短40秒不叫主循环了,这叫一条道走到底。

出0入0汤圆

 楼主| 发表于 2017-8-12 08:57:58 | 显示全部楼层
lusson 发表于 2017-8-12 08:55
如果没有用操作系统,把主任务分割使用状态机
你这最短40秒不叫主循环了,这叫一条道走到底。 ...

没有操作系统 主程序是个while1 是一条道走到底,

出0入0汤圆

发表于 2017-8-12 09:06:45 | 显示全部楼层
lusson 发表于 2017-8-12 08:55
如果没有用操作系统,把主任务分割使用状态机
你这最短40秒不叫主循环了,这叫一条道走到底。 ...

有道理,用一个tick,10ms执行模块1,20ms执行模块2,30ms执行模块3......100MS执行模块10,周而复始,每个模块定期喂狗就可以了,定时器里面喂狗的方式,确实不可取

出0入0汤圆

发表于 2017-8-12 09:08:38 | 显示全部楼层
蜗牛蜗牛 发表于 2017-8-12 08:52
主循环时间太长,最短40秒,最长时候1分40秒,所以想到用定时器,结果死机了狗也不管用 ...

那里长就在那里喂,一直喂

出0入0汤圆

发表于 2017-8-12 09:30:42 | 显示全部楼层
什么样的程序 主程序下来能50S   实在是想不通

出0入22汤圆

发表于 2017-8-12 09:31:19 来自手机 | 显示全部楼层
怎么会有那么长的业务流程?

出0入0汤圆

 楼主| 发表于 2017-8-12 09:32:12 | 显示全部楼层
本帖最后由 蜗牛蜗牛 于 2017-8-12 09:33 编辑
STT 发表于 2017-8-12 09:30
什么样的程序 主程序下来能50S   实在是想不通


放50秒音乐.........stm32DAC放音乐,

出0入0汤圆

发表于 2017-8-12 09:42:38 | 显示全部楼层
要放个10min的音乐 啥也别干了

出10入18汤圆

发表于 2017-8-12 09:51:54 来自手机 | 显示全部楼层
一首劲歌金曲下来确实什么都不用干了

出0入8汤圆

发表于 2017-8-12 09:54:09 | 显示全部楼层
本身 程序架构问题,竟然能想到定时器喂狗, 你主程序跑飞了, 定时器 也有相应中断响应,除非主程序跑飞,把定时器关闭了,这个概率 实在是 太小了。

出0入0汤圆

 楼主| 发表于 2017-8-12 10:00:13 | 显示全部楼层
STT 发表于 2017-8-12 09:42
要放个10min的音乐 啥也别干了

有解决方案吗?

出0入0汤圆

 楼主| 发表于 2017-8-12 10:00:27 | 显示全部楼层
wpy 发表于 2017-8-12 09:51
一首劲歌金曲下来确实什么都不用干了

有解决方案吗?

出0入0汤圆

 楼主| 发表于 2017-8-12 10:00:43 | 显示全部楼层
kebaojun305 发表于 2017-8-12 09:54
本身 程序架构问题,竟然能想到定时器喂狗, 你主程序跑飞了, 定时器 也有相应中断响应,除非主程序跑飞, ...

有解决方案吗?

出0入8汤圆

发表于 2017-8-12 10:02:49 | 显示全部楼层

回复的帖子中 已经 有解决办法给你了。

出0入0汤圆

 楼主| 发表于 2017-8-12 10:07:10 | 显示全部楼层
kebaojun305 发表于 2017-8-12 10:02
回复的帖子中 已经 有解决办法给你了。

我的意思是除了状态机,和不断喂狗,你还有其他好方法吗

出0入55汤圆

发表于 2017-8-12 10:07:29 来自手机 | 显示全部楼层
程序思想不对,主程序大循环一定要很快轮回,也就是说各模块都不能有阻塞型的延时,延时时必须把释放CPU给其他人用。可以用没操作系统的话可以用状态机写

出0入0汤圆

 楼主| 发表于 2017-8-12 10:09:07 | 显示全部楼层
jssd 发表于 2017-8-12 10:07
程序思想不对,主程序大循环一定要很快轮回,也就是说各模块都不能有阻塞型的延时,延时时必须把释放CPU给 ...

谢谢

出0入0汤圆

发表于 2017-8-13 05:33:00 | 显示全部楼层
看来楼主的编程水平还停留在delay水平啊。这样的程序51就可以跑出来。
楼主适合当领导,让手下人干吧。

出0入0汤圆

 楼主| 发表于 2017-8-13 09:32:04 | 显示全部楼层
jssd 发表于 2017-8-12 10:07
程序思想不对,主程序大循环一定要很快轮回,也就是说各模块都不能有阻塞型的延时,延时时必须把释放CPU给 ...

状态机那个我之前听过研究研究,主要是现在这程序有点复杂,有个拨动开关上波音量+下拨音量-中间是设定音量 ,拨动最上面是声音最大,下面是音量最低, 用的播放音乐解码是用DCA硬解码wav,还有音乐更新,能添加音乐,还有RTC ,rtc可以设置时间,里面还有rtc校准,所有声音大小都按照设定时段运行,所有这个RTC准确度也很关键,还有IAP 升级程序,用的是SD卡bin升级,中断好像现在是3层嵌套了,

出0入0汤圆

发表于 2017-8-13 09:44:48 | 显示全部楼层
这么简单的功能,用状态机很好搞定,嫌麻烦上OS

出0入0汤圆

发表于 2017-8-13 09:48:06 来自手机 | 显示全部楼层
学习了,受用

出0入0汤圆

发表于 2017-8-13 09:48:25 来自手机 | 显示全部楼层
。。。我怎么付费了。。。。。。。。。

出0入168汤圆

发表于 2017-8-13 10:14:42 来自手机 | 显示全部楼层
程序架构有问题,主程序一个循环不超过1秒。

出0入8汤圆

发表于 2017-8-13 10:18:45 | 显示全部楼层
主程序时间50秒左右,真的是个人才!!!

出0入0汤圆

发表于 2017-8-14 16:21:50 | 显示全部楼层
主程序40多秒我笑了,楼主是要换个思路

出0入4汤圆

发表于 2017-8-15 00:30:18 | 显示全部楼层
播放音乐不需要一直占用CPU吧,不然电脑只要一听音乐,什么也干不成了

出0入0汤圆

发表于 2017-8-16 14:04:59 | 显示全部楼层
主程序架构有问题,播放音乐不需要死等,可以用定时中断

出0入0汤圆

发表于 2017-8-16 18:15:06 | 显示全部楼层
#include "bsp_audio.h"
#include "string.h"

#define BSP_AUDIO_DMA_BUFFER_SIZE     512

static CBREAD readfile;
static void *filehandle;
static u8 isplaying = 0;
static u8 buffer[BSP_AUDIO_DMA_BUFFER_SIZE];

#define DAC_DHR8R1_ADDRESS     0x40007410

void bsp_audio_init(u16 sr)
{
    GPIO_InitTypeDef            GPIO_InitStructure;
    DMA_InitTypeDef             DMA_InitStructure;
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;
    DAC_InitTypeDef             DAC_InitStructure;
    NVIC_InitTypeDef            NVIC_InitStructure;
   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//AMP ShutDown
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 90000000 / sr;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

    TIM_DMACmd(TIM4, TIM_DMA_Update, ENABLE);
   
    DAC_DeInit();
   
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_1023;
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);
   
    DAC_Cmd(DAC_Channel_1, ENABLE);

    //DAC_DMACmd(DAC_Channel_1, ENABLE);
   
    DMA_DeInit(DMA1_Stream6);
    DMA_InitStructure.DMA_Channel = DMA_Channel_2;  
    DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_ADDRESS;
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&buffer;
    DMA_InitStructure.DMA_BufferSize = BSP_AUDIO_DMA_BUFFER_SIZE;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA1_Stream6, &DMA_InitStructure);
   
    DMA_ITConfig(DMA1_Stream6, DMA_IT_TC | DMA_IT_HT, ENABLE);
   
    DMA_Cmd(DMA1_Stream6, ENABLE);
   
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
u8 bsp_audio_isbusy(void)
{
    return isplaying;
}
void bsp_audio_start(CBREAD read, void *phandle)
{
    u32 readlen;
    if(isplaying == 1)
    {
        return;
    }
    readfile = read;
    filehandle = phandle;
    readlen = readfile(filehandle, buffer, BSP_AUDIO_DMA_BUFFER_SIZE);

    if(readlen == 0)
    {
        return;
    }
    TIM_Cmd(TIM4, ENABLE);
    AUDIO_AMP_ON;
    isplaying = 1;
}

void bsp_audio_stop(void)
{
    TIM_Cmd(TIM4, DISABLE);
    memset(buffer, 0x80, sizeof(buffer));
    isplaying = 0;
    AUDIO_AMP_OFF;
}

void DMA1_Stream6_IRQHandler(void)
{
    u32 readlen;
    if(DMA_GetITStatus(DMA1_Stream6, DMA_IT_HTIF6) == SET)
    {
        readlen = readfile(filehandle, buffer, BSP_AUDIO_DMA_BUFFER_SIZE / 2);
        if(readlen == 0)
        {
            bsp_audio_stop();
        }
    }
    else if(DMA_GetITStatus(DMA1_Stream6, DMA_IT_TCIF6) == SET)
    {
        readlen = readfile(filehandle, buffer + BSP_AUDIO_DMA_BUFFER_SIZE / 2, BSP_AUDIO_DMA_BUFFER_SIZE / 2);
        if(readlen == 0)
        {
            bsp_audio_stop();
        }
    }
    DMA_ClearITPendingBit(DMA1_Stream6, DMA_IT_TCIF6 | DMA_IT_HTIF6);
}

















出0入0汤圆

发表于 2017-8-16 18:16:10 | 显示全部楼层
播放音乐用DMA+IRQ,根本不需要主循环。

出0入0汤圆

发表于 2017-8-16 18:39:53 | 显示全部楼层
要运行50秒的主程序,到底执行了什么事情啊?!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 18:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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