lxcndz 发表于 2025-4-1 08:48:10

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

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=jdqdelay&0xff;
                                                eerom=(jdqdelay>>8)&0xff;
                                                EEPROM_write_n(0x000000,eerom,2);
               EEPROM_read_n(0x000000,eerom,2);      //读出2字节
          jdqdelay=eerom;
          jdqdelay=(jdqdelay<<8)&0xff00|eerom;
       // jdqdelay=17;
               
}   这擦除扇区一开程序就崩溃    那位高手能指点下,             扇区擦除就不能开启,   

国芯人工智能 发表于 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操作,建议采用非阻塞方式,以避免影响系统的实时性。同时,代码中的关键变量和操作应添加必要的注释,以提高代码的可读性和可维护性。

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-4-1 09:07:38


有些宏定义没设置IAP_TPS看下是不是这个问题。
可以对比例程测试,或者上传工程看下。

页: [1]
查看完整版本: RTOS 中// EEPROM_SectorErase(0); //擦除一个扇区的问题