历史上的今天
返回首页

历史上的今天

今天是:2025年03月08日(星期六)

2020年03月08日 | STM32开发笔记80: 在构造函数中调用延时函数应注意的问题

2020-03-08 来源:eefocus

单片机型号:STM32L053R8T6


W5500驱动程序完成后,运行时,单片机死机。W5500驱动程序先前已经在项目中具体应用过,运行的比较稳定。这次移植后,没有做改动,但是单片机运行时死机。


此项目与先前项目的不同点在于,项目中有FreeRTOS操作系统运行,原先的项目没有,最后将问题聚焦于W5500的构造函数上,如下程序所示:


CW5500::CW5500(void):CSpi()

{

//uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};

//注册相关的函数

reg_wizchip_cris_cbfunc(w5500_cris_enter, w5500_cris_exit);

reg_wizchip_cs_cbfunc(w5500_cs_select, w5500_cs_deselect);

reg_wizchip_spi_cbfunc(w5500_spi_readbyte, w5500_spi_writebyte);

    //硬件复位w5500

    this->reset();

    //软件复位w5500

    ctlwizchip(CW_RESET_WIZCHIP, (void*)NULL);

    //初始化socket buffer

    ctlwizchip(CW_INIT_WIZCHIP, (void*)memsize);

}

 

void CW5500::reset(void)

{

this->W5500_RESET.Set_1();

Target.Delayms(10);

this->W5500_RESET.Set_0();

Target.Delayms(10);

this->W5500_RESET.Set_1();

Target.Delayms(10);

}

驱动程序在构造函数中调用了延时函数,而延时函数具体的实现如下:


void CTarget::Delayms(uint16_t u16_ms)

{

osDelay(u16_ms);

}

延时函数直接调用了FreeRTOS操作系统的osDelay。原先程序的延时函数是如下实现的:


void CTarget::Delayms(uint16_t u16_ms)

{

HAL_Delay(u16_ms);

#if IWDG_MODE != 0

this->Iwdg.Refresh();

#endif

}

再看main函数,程序如下:


int main(void)

{

  osThreadDef(DefaultTask, StartDefaultTask, osPriorityNormal, 0, 128);

  DefaultTaskHandle = osThreadCreate(osThread(DefaultTask), NULL);

 

osKernelStart();

//以下程序不会被执行

  while (1)

  {

 

  }

}

FreeRTOS操作系统是在main函数中启动的,也就是只有执行完osKernelStart函数,osDelay函数才会起作用。而构造函数是先于main函数之前执行的,所以驱动程序调用延时函数时,操作系统还没有启动,导致死机现象的出现。


解决方法:


(1)用上述2种方式实现延时函数,通过参数传递加以选择;


(2)或者不在构造函数中调用延时函数。


我觉得第2种方法是比较好的。

推荐阅读

史海拾趣

FEMA Electronics Corporation公司的发展小趣事

随着全球化的加速推进,FEMA意识到要想在更广阔的市场上取得更大的发展,必须实施国际化战略。于是,公司开始积极拓展海外市场,与多个国家和地区的客户建立了合作关系。同时,FEMA还加强了与国际先进企业的技术交流和合作,不断吸收和借鉴国际先进的经验和技术。这些举措为公司的国际化发展提供了有力支持,使FEMA的产品在国际市场上赢得了更广泛的认可。

富信半导体(FOSAN)公司的发展小趣事

FEMA的创始人李明(化名)是一位资深的电子工程师,他在一次与客户的交流中,发现了市场对高质量电子元件的迫切需求。于是,他毅然决定创办FEMA,专注于研发和生产高性能的电子元器件。创业初期,公司面临着资金短缺、技术瓶颈等重重挑战。然而,李明凭借坚定的信念和不懈的努力,成功攻克了技术难关,并与多家知名企业建立了合作关系,为公司的发展奠定了坚实的基础。

FORMOSA公司的发展小趣事

随着互联网和电子商务的兴起,一家名为“FORMOSA电子商城”的平台应运而生。该平台利用先进的互联网技术,为电子产品制造商、分销商和消费者搭建了一个高效、便捷的在线交易平台。FORMOSA电子商城不仅提供丰富的电子产品选择,还通过智能化的推荐系统和优质的客户服务,为用户提供个性化的购物体验。平台还积极推动供应链的数字化转型,帮助合作伙伴优化库存管理、提高运营效率。在短短几年内,FORMOSA电子商城便成为了电子行业内知名的电子商务品牌。

ACCRETECH公司的发展小趣事

在台湾,一家名为“FORMOSA电子元件制造厂”的公司,起初是一家小型电阻器生产商,专注于为本地电子制造商提供基础元件。随着个人电脑和消费电子市场的蓬勃发展,该公司敏锐地捕捉到市场需求,开始投资研发高精度、低成本的电子元件。通过不断的技术创新和质量控制,FORMOSA电子元件逐渐在国际市场上获得认可,成为多家知名电子产品制造商的供应商。公司还积极拓展海外市场,在欧洲和北美设立分支机构,进一步巩固了其在全球电子元件市场的地位。

Advanced Analog公司的发展小趣事

创新是Advanced Analog公司发展的核心动力。公司始终坚持自主研发和技术创新,不断推出新的产品和技术。这些新产品不仅满足了市场的多样化需求,也进一步巩固了公司在电源管理IC领域的领先地位。同时,Advanced Analog还积极关注行业发展趋势和未来技术走向,为公司的长远发展做好战略布局。

ARMKEIL Microcontroller Tools公司的发展小趣事

ARMKEIL Microcontroller Tools公司的起点可以追溯到Keil公司的成立。1985年,Keil Elektronik GmbH(凯尔电子有限责任公司)在德国慕尼黑正式成立,由一群热衷于嵌入式系统开发的工程师创立。起初,公司的主要业务是开发和销售嵌入式系统的开发工具,这些工具为当时的电子工程师提供了强大的支持。随着业务的发展,Keil逐渐在嵌入式系统开发领域崭露头角。

问答坊 | AI 解惑

中断嵌套

我使用LPC2132做中断嵌套,好困惑,我使用的是KEIL3,高手支招啦!…

查看全部问答>

嵌入式处理器简单介绍-医疗影像领域的技术推动者

DSP研发应用不断发展,嵌入式处理器在过去几年来技术也在不断进步,在医疗影像领域之中有广泛的应用。随着技术的不断发展,嵌入式处理器能帮助医疗仪器达到更快的诊断速度、更高的准确度,同事护理的成本也相应降低,使患者自我护理逐渐成 ...…

查看全部问答>

基于winCE的控件重绘

我用的是C#写的,写在paint事件中,运行不到那里 我就改到构造函数中去绘制同样也没有显示出来 public ucDrawLine()         {             InitializeComponent(); &nb ...…

查看全部问答>

驱动的makefile、sourse还有ini文件该怎么写?

请问一下,文件系统过滤驱动程序编译需要的makefile和source文件怎么来写,我编写时是使用的ifs kit中sfilter过滤驱动中的原文件修改。但编译后nms翻译提示没有时间戳和可能过期,还有安装后重起进不了系统。请高手 ...…

查看全部问答>

弱!!ARM汇编的问题

小弟在看ARM的汇编的时候,发现里面的指令用法不明白!! 如: MOVEQ R0,#1 BEQ POW_END 这里的执行条件EQ,什么意思? MOVHS R0,#0 这条语句中HS什么意思? 望大侠赐教!!!…

查看全部问答>

上网本/MID/PMP等设备的朋友,请加入群!

我现在做eepc ARM 开发,建了一个MID/上网本/PMP等设备的开发群! 方便大家交流技术和市场。 群号:60587325 …

查看全部问答>

关于实时数据采集

   麻烦各位大侠们了    自己要做的是现场AD,然后光纤传输,之后接收还原DA输出,只是一个实时的采集,处理的部分用的不多,整个过程要求在1个微秒左右,选用的是Cyclone EP1C6.但是问题是,AD是12位并行输出,采样时钟大体准 ...…

查看全部问答>

STM32F10xx时钟

                                 STM32F10xx有内部时钟,启动后采用内部时钟,检查到外部时钟稳定后切换外部时钟,是这样吗?假如是这样,内部高速 ...…

查看全部问答>