找回密码
 立即注册
查看: 77|回复: 2

RTOS 中// EEPROM_SectorErase(0); //擦除一个扇区的问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-01 08:48:10

2

主题

0

回帖

14

积分

新手上路

积分
14
发表于 2025-4-1 08:48:10 | 显示全部楼层 |阅读模式
void vSystemInit( void )
{
        unsigned char count;unsigned int i;
       
    WTST = 0;     //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;    //扩展寄存器(XFR)访问使能
    CKCON = 0;    //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;     //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x02;     //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x10;     //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x22;     //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;     //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;     //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;     //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;     //设置为准双向口
       

    outjdq=1;
       
           XOSCCR=0xc0;
    while(!(XOSCCR&1));
    CLKDIV=0x00;
    CLKSEL=0x01; //外部晶振
//    DebugPrintfInit();
//    printf("STC32G FreeRTOS 测试程序!\r\n");
flag1=0;flag=0;resttime=0;

  clr_f_ac;set_f_dc;
        gate1=1;gate2=1;
        ag1=1;ag2=1;
         count=30;
         do{
          i =4000;
          while(--i);
     }while(--count);
       
        jdqdelay=125;
                 // EEPROM_SectorErase(0); //擦除一个扇区       
                                                 _nop_();      
                                                _nop_();
             _nop_();
            _nop_();
                                                 _nop_();      
                                                _nop_();
             _nop_();
            _nop_();
                                                 _nop_();      
                                                _nop_();
             _nop_();
            _nop_();
                                               
                                                eerom[0]=jdqdelay&0xff;
                                                eerom[1]=(jdqdelay>>8)&0xff;
                                                EEPROM_write_n(0x000000,eerom,2);
                 EEPROM_read_n(0x000000,eerom,2);        //读出2字节
          jdqdelay=eerom[1];
          jdqdelay=(jdqdelay<<8)&0xff00|eerom[0];
         // jdqdelay=17;
                 
}     这擦除扇区一开程序就崩溃    那位高手能指点下,             扇区擦除就不能开启,   

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-1 08:58:00 | 显示全部楼层
在RTOS(实时操作系统)环境中,vSystemInit函数通常用于初始化系统硬件资源,确保系统在启动时能够正确配置并进入稳定状态。从您提供的代码片段来看,vSystemInit函数主要完成了以下几个任务:

1. CPU指令延时设置:通过WTST = 0;将CPU执行指令的速度设置为最快。这通常是为了提高系统的响应速度,尤其是在实时性要求较高的应用中。

2. 扩展寄存器访问使能:通过EAXFR = 1;使能扩展寄存器的访问。扩展寄存器通常用于存储一些特殊的配置或状态信息,使能后可以对其进行读写操作。

3. XRAM访问速度优化:通过CKCON = 0;提高访问XRAM的速度。XRAM是外部RAM,优化其访问速度可以提升系统的整体性能。

4. GPIO端口配置:通过设置P0M1、P0M0等寄存器,将GPIO端口配置为准双向口。准双向口是一种常见的GPIO模式,适用于大多数输入输出场景。

5. 外部晶振配置:通过XOSCCR=0xc0;和CLKSEL=0x01;配置外部晶振作为系统时钟源。外部晶振通常比内部振荡器更稳定,适用于对时钟精度要求较高的应用。

6. 调试信息输出:注释掉的DebugPrintfInit();和printf("STC32G FreeRTOS 测试程序!\r\n");表明该函数可能还用于初始化调试信息输出功能,但在当前代码中被禁用。

关于您提到的EEPROMSectorErase(0);问题,该函数通常用于擦除EEPROM的一个扇区。在RTOS环境中,直接调用该函数可能会导致系统阻塞,尤其是在多任务环境下。为了避免这种情况,建议将EEPROM操作放在一个独立的任务中,或者使用非阻塞的方式进行操作。例如,可以使用RTOS提供的信号量或消息队列机制,确保EEPROM操作不会影响其他任务的执行。

此外,flag1=0的用途不明确,建议在代码中添加注释,说明该变量的作用,以便后续维护和调试。

总结来说,vSystemInit函数在RTOS环境中扮演着重要的角色,确保系统硬件资源的正确初始化。对于EEPROM操作,建议采用非阻塞方式,以避免影响系统的实时性。同时,代码中的关键变量和操作应添加必要的注释,以提高代码的可读性和可维护性。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-1 09:07:38 | 显示全部楼层

有些宏定义没设置IAP_TPS看下是不是这个问题。
可以对比例程测试,或者上传工程看下。
截图202504010905459589.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 00:13 , Processed in 0.109203 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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