This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好!
我尝试通过微控制器上 ADCD 模块的通道 ADCDIN2和 ADCDIN3 (电压适用于两个通道、直接通过万用表在 ADC 通道引脚处测量)转换2.5V 直流电压而不产生基本噪声。 AdcdRegsiters 的控制权交给 CPU2、两个 SOC 的触发也由 CPU2完成。 两个项目(每个内核一个项目)都是具有操作系统的项目。 这两个 SOC 每10毫秒由操作系统的时钟模块触发一次。 预期值为2.5/3.3*4096=3103,因为我以12位分辨率运行。
问题本身如下所示:AdcdResultRegister 显示的值大约为2300、而不是预期的大约3100。
我观察到的情况:我还让 ADCA 模块按 预期工作、在我 的应用程序中不会出现错误、我初始化并触发了错误(我将在我的文本末尾发布我的代码)、其方式与 ADCD 模块完全相同。
我在事故中观察到的情况: 当我在 CPU2上加载 CPU1的.out 文件时、让它运行、不要重置器件、在 CPU2上加载 CPU2的正确.out 文件并让该程序运行后、ADCD 模块按预期工作、并在 AdcdResultRegister 中显示大约为3000-3100的值! 当我复位器件时、必须首先在 CPU2上运行 CPU1 .out 文件、然后 ADCD 才能按预期再次运行。 在我看来、CPU1的.out 文件中的某些内容会初始化微控制器中的某些内容、这是 ADCD 模块正常工作所必需的(但显然对于 ADCA 模块来说不是必需的、因为这在内核的正常加载和运行时可以正常工作)、 在器件复位时将删除该位。
我希望你们能为我提供一些建议,我会提前表示感谢。
CPU1代码:
MAIN_1.c:
int main() { system_printf ("enter main ()\n"); InitGpio (); InitDrehzahlsensoren (); InitSF_DC_Test (); #ifdef _standalone IPCBootCPU2 (C1C2_Brom_bootmode_boot_boot_boot_f_floin); #endif BIOS_start(); 返回(0); }
Drehzahlsensoren_1.c:
#include //Initializiert Die eCAP1 Peripherie、Die Flanken des Drehzahlsensors 1 erkennt void InitDrehzahlerkennung_1 () { EALLOW;InputXlak.INPUTSELECTLOelt.BIT.INECT T7SELIS= 0;// INPUCC1 INTRENTRUSTU1.INTREN.INPUTINTRENTRU1.INTRENTRENTREN.INTRENTRENTRU1.INTRENTRENTRENTRU1.INTRENTRENTRENTRU1.INTRIP1 = 0;// INTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRU1.INTRENTRENTRENTRENTRENTRU1.INTRENTRENTRENTRU1.INTRU1.INTRENTRENTRENTRU1.INTRU1.INTRENTRENTRENTRENTRENTRENTRU1. //Initializiert Die ECap2 Peripherie、Die Flanken des Drehzahlsensors 2 erkennt void InitDrehzahlerkennung_2 () { EALLOW;InputXlectLOelt.bit.INECT T8SELCLIS= 0;// INPUT8 INPUBLDER8 = INTREN.INTRENTRENTRU8;INPUTINTRENTRU8 INTRENTRENTREMORT.INTREN.INTRENTRENTREMENTRENTRU8 = 0 = INTRENTRU8 INTRUTRENTRENTRUTRUTREN.INTRUTRENTRENTREMORT8 INTRIPERENTRENTREMENTREMEN.INTREMENTRENTRENTRENTREN.INTREN.INTREMENTREMENTREMENTREN.INTREMEN.INTREMEN.INTREN.INTRIPERENTREN.INTRENTRENTRENTRENTRENTREN.INTR void InitDS_DC_Test (){EALLOW;DevCfgRegs.CPUSEL11.bit.ADC_D = 1;//ADCD 寄存器未发送 CPU2 verbunden EDIS;}//Initializiert Die ECap3 Peripherie、Die das PWM Signal für Initialersten ADC erbunund Pusht Initit; }UTPU2 (PLUG_OUTFPU3)、GPIO3 (PGCTRU3)、GPIO3 (PLU_OUTFPU3)、GPIO3 (PUTU3)//GPIO3线性输出 konfiguriert EALLOW; OutputXbarRegs.OUTPUT2MUX0TO15CFG.bit.MUX4 = 3;//Der ECap3输出线性发送 MUX4 der OUTPUTXBAR2 verbunden OutputXbarRegs.OUTPUT2MUXENAB4 = 3 ;// DCCEST.USTR1 = UCC3/ UCC3/ UTRUTRUT1 = UCCEST.USTRUTRUT1 = USTRUT1 = USTRUT1 = UTRUTRUSTRUTRUSTRUT1 = UTRUTRUTRUSTRUTRUTRUTRUT1 = UTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUT1 = //Initializiert 裸片 ECap4 Peripherie、Die das PWM Signal für den zweiten ADC erzeugt void InitADC2MCLK () { GPIO_SetupPinMux (2、GPIO_MUX_CPU2、5);//GPIO2 wivon CPU2 gesteuround OUTPUTXBAR1 (2 、GPIO2);GPIO2输出引 脚2、GPIO2、GPIOMUTRUTRUTRU1、GPIO2、GPIOMUTRUTRUTRU2、GPIOMUTRU1、GPIOUTX6、GPIOUTRUTRUTRUTRU0、GPIOUT2、GPIOMUTRUTRU0、GPIOUTRUTRU0、GPIOUTU//Der ECap3输出 wid mUX4 der OUTPUTXBAR1 verbunden OutputXbarRegs.OUTPUT1MUXENABLE.bit.MUX6 = 1;//Der Slot MUX4 der OUTPUTXBAR1 wrd aktiviert DevCfgRegs.CPUSEL1.bit.MUX6 = 1;// Dedtinitzh ( 1) INCLK = 1; ENCH INCLITH (1) INCLK = 1) INITH (INCLK) INCLK (ENCH 1) INITH (ENCH INCLK);INCLINITH (INCLK = INCLK) INITH (ENCH 1) INCLK (ENCH INITH (ENCH) INCLK) INITH (ENCH INITH (ENCH 1) INCLK (INCLINITH (ENCH) INIT
Schwingungsfuehler_1.c:
#include "Schwingungsfuehler_1.h" void InitSF_DC_Test () { EALLOW; DevCfgRegs.CPUSEL11.bit.ADC_A = 1;//ADCA 寄存器未发送 CPU2 verbunden EDIS; }
CPU2代码:
MAIN_2.c:
#include #include #include #include #include "main_2.h" int main () { system_printf ("enter main()\n"); InitDrehzahlsensoren(); InitSF_DC_Test (); BIOS_start(); 返回(0); }
Drehzahlsensoren_2.c:
#include
//Initializiert Die eCAP1 Peripherie、Die Die Flanken des Drehzahlsensors 1 erkennt
空 InitDrehzahlerkennung_1 ()
{
EALLOW;
CpuSysRegs.PCLKCR3.bit.ECAP1 = 1; //eCAP1 bekommt den Betriebstakt
ECap1Regs.ECCTL1.bit.CAP1POL=0; //CEVT1 wrd bei steigender Flanke gefeuert
ECap1Regs.ECCTL1.bit.CAP2POL=0; //CEVT2 wrd bei steigender Flanke gefeuert
ECap1Regs.ECCTL1.bit.CAP3POL=0; //CEVT3前侧保险丝 Flanke gefeuert
ECap1Regs.ECCTL1.bit.CAP4POL=0; //CEVT4前侧转向器 Flanke gefeuert
ECap1Regs.ECCTL1.bit.CTRST1 = 1; // Zähler 线 zurückgesetzt CEVT1
ECap1Regs.ECCTL1.bit.CTRST2 = 1; // Zähler 线性 zurückgesetzt CEVT2
ECap1Regs.ECCTL1.bit.CTRST3 = 1; // Zähler 线 zurückgesetzt CEVT3
ECap1Regs.ECCTL1.bit.CTRST4 = 1; // Zähler 线 zurückgesetzt CEVT4
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; //cap Register werden mit time-Stps der jeweiligen CEVTS geladen
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Zähler des ECAP1 wrd gestartet
ECap1Regs.ECEINT.BIT.CEVT1 = 1; //CEVT1 feuert einen eCAP1-在 Richtung CPU 中进行中断
EDIS;
}
//Initializiert Die ECap2 Peripherie、Die Die Flanken des Drehzahlsensors 2 erkennt
空 InitDrehzahlerkennung_2 ()
{
EALLOW;
CpuSysRegs.PCLKCR3.bit.ECAP2 = 1; //ECap2 bekommt den Betriebstakt
ECap2Regs.ECCTL1.bit.CAP1POL=0; //CEVT1 wrd bei steigender Flanke gefeuert
ECap2Regs.ECCTL1.bit.CAP2POL=0; //CEVT2 wrd bei steigender Flanke gefeuert
ECap2Regs.ECCTL1.bit.CAP3POL=0; //CEVT3 wrd bei steigender Flanke gefeuert
ECap2Regs.ECCTL1.bit.CAP4POL=0; //CEVT4 winitrd bei steigender Flanke gefeuert
ECap2Regs.ECCTL1.bit.CTRRST1 = 1; Zähler Ω 线性 zurückgesetzt CEVT1
ECap2Regs.ECCTL1.bit.CTRST2 = 1; Zähler Ω 线性 zurückgesetzt CEVT2
ECap2Regs.ECCTL1.bit.CTRST3 = 1; // Zähler 线性 nach CEVT3 zurückgesetzt
ECap2Regs.ECCTL1.bit.CTRRST4 = 1; // Zähler 线性 zurückgesetzt CEVT4
ECap2Regs.ECCTL1.bit.CAPLDEN = 1; //CAP 寄存器未发送时间戳记、Jeweiligen CEVT geladen
ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1; // Zähler DES ECAP2 wrd gestartet
ECap2Regs.ECEINT.BIT.CEVT1 = 1; //CEVT1 feuert einen ECap2 - Richtung CPU 中的中断
EDIS;
}
空 InitDS_DC_Test ()
{
EALLOW;
CpuSysRegs.PCLKCR13.bit.ADC_D = 1; //ADCD bekommt den Betriebstakt
AdcdRegs.ADCCTL2.bit.prescale = 6; //ADCLK = SYSCLK/4
AdcSetMode (ADC_ADCD、ADC_Resolution_12位 //ADCD auf 12位 Auflösung und Singlemode eingestellt
、ADC_SIGNALMODE_SINGLE);
AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1; //ADCD wrd eingeschalettet
DELAY_US (1000); //1ms Wartezeit um ADCD komplett hochfahren zu Lassen
AdcdRegs.ADCSOC0CTL.bit.CHSEL = 2; //SOC0 kon眩 晕 Kanal 2.
AdcdRegs.ADCSOC0CTL.bit.ACQPS = 15; //SOC0 S&H 窗口、具有16个 SYSCLK eingestellt
AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 0; //SOC0线对软件 getriggerert
AdcdRegs.ADCSOC1CTL.bit.CHSEL = 3; //SOC1 kon眩 晕 Kanal 3.
AdcdRegs.ADCSOC1CTL.bit.ACQPS = 15; //SOC1 S&H 窗口、具有16个 SYSCLK eingestellt
AdcdRegs.ADCSOC1CTL.bit.TRIGSEL = 0; //SOC1线性导入软件 getriggerert
EDIS;
}
void starteADCWandlungDS_DC () //alle 10ms
{
AdcdRegs.ADCSOCFRC1.bit.SOC0 = 1; //SOC0具有 getriggerert;Abtetung Kanal 2.
AdcdRegs.ADCSOCFRC1.bit.SOC1 = 1; //SOC1具有 getriggerert;Abtetung Kanal 3.
}
//Initializiert Die ECap3 Peripherie、Die das PWM Signal für den ersten ADC erseugt
空 InitADC1MCLK ()
{
CpuSysRegs.PCLKCR3.bit.ECAP3 = 1; //ECap3 bekommt den Betriebstakt
ECap3Regs.ECCTL2.bit.CAP_APWM = 1; //ECap3模式
ECap3Regs.CAP1 = 20000000; //裸片 Periodaauer PWM beträgt 100ms
ECap3Regs.CAP2 = 5000000; //裸片开启时间器 PWM beträgt 25ms
ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1; //Der Zähler des ECap3 wrd gestartet
EDIS;
}
//Initializiert DIE ECap4 Peripherie、Die das PWM Signal für den zweiten ADC erzeugt
空 InitADC2MCLK ()
{
EALLOW;
CpuSysRegs.PCLKCR3.bit.ECAP4 = 1; //ECap4 bekommt den Betriebstakt
ECap4Regs.ECCTL2.bit.CAP_APWM = 1; //ECap4模式
ECap4Regs.CAP1 = 20000000; //裸片 Periodaauer PWM beträgt 100ms
ECap4Regs.CAP2 = 5000000; //裸片开启时间器 PWM beträgt 25ms
ECap4Regs.ECCTL2.bit.TSCTRSTOP = 1; //Der Zähler des ECap4 wrd gestartet
EDIS;
}
//中断例程 zum Verarbeiten DER 时间戳 des eCAP1-Moduls für Die Berechnung
//von Drehzahl und Periodendauer
void hon_timestams_1 ()
{
RPM_1 =(1.0/(ECap1Regs.CAP1*(1.0/CCP_FREQ))))*60.0; // Berechnung der Drehzahl
periodode_1 = ECap1Regs.CAP1*(1.0/CPU_FREQ); // Berechnung der Periodaauer
ECap1Regs.ECCLR.bit.CEVT1 = 1; //CEVT1中断标志 löschen
ECap1Regs.ECCLR.bit.INT = 1; //eCAP1-Interrupt-Flag löschen
}
//中断例程 zum Verarbeiten DER 时间戳 des ECap2-Moduls für Die Berechnung
//von Drehzahl und Periodendauer
void hon_timestams_2 ()
{
RPM_2 =(1.0/(ECap2Regs.CAP1*(1.0/CCP_FREQ))))*60.0; // Berechnung der Drehzahl
periodode_2 = ECap2Regs.CAP1*(1.0/CPU_FREQ); // Berechnung der Periodaauer
ECap2Regs.ECCLR.bit.CEVT1 = 1; //CEVT1中断标志 löschen
ECap2Regs.ECCLR.bit.INT = 1; //ECap2-Interrupt-Flag löschen
}
void DS_DC_Test_1 ()
{
POWER_DS1 = AdcdResultRegs.ADCRESULT0;
}
void DS_DC_Test_2 ()
{
power_ds2 = AdcdResultRegs.ADCRESULT1;
}
空 InitDrehzahlsensoren()
{
InitDrehzahlerkennung_1 ();
InitDrehzahlerkennung_2();
InitADC1MCLK();
InitADC2MCLK ();
InitDS_DC_Test ();
}
Schwingungsfuehler_2.c:
#include "Schwingungsfuehler_2.h" void InitSF_DC_Test () { EALLOW; CpuSysRegs.PCLKCR13.bit.ADC_A = 1;//ADCA bekomden Betriebstakt AdcaRegs.ADCCTL2.bit.prescale = 6;ADCA bekomden BECClemstakt Adcle.ADC12_ADCK_Resolutions/ADC12_ADCK_12 Auflösung;ADCK_12 / ADCK_ADCK_ADCK_12位 ADCK_Resolutions/ADCK_4 (ADCK_12) ADC_SIGNALMODE_SINGLE); AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//ADCA 无线网络延迟 _US (1000);//1ms Wartezeit um ADCA komplett 寄存器 hchfahren AdcaRegs.CS0.ADCSOC0 = ADCTR0;ADCSOC0 = ADCTR0 = ADCTR0;ADCSO0 = ADCTR0 = ADCTR0。 //SOC1 konigert Kanal 1 AdcaRegs.ADCSOC1CTL.bit.ACQPS = 15;//SOC1 S&H 窗口具有16个 SYSCLK 获取存储 器。ADCSOC1CTL.bit.TRIGSEL = 0;//SOC1 WIRG REGLES 软件获取 1个 SYSCLK;ADC1COVERT = 0;ADCEST.ADC1.ADC1.ADCf 0;ADCESR = ADC1.ADC1.ADCf Abultung Kanal 1 } void SF_DC_Test_1 ()//tetalle 10ms { if (periode_1 > 0.1)//wenn Unwuchtsignal unter 10Hz (600 u/min) { static uint16 counter = 0;// Zählervariable für tisle berits abgetasersumte static UwuchtSIGNAL unter 10Hz (600 u/min)}{static uintele+ für adt uerteldas 0;// ademe+ adtesfers/admes+ rumersum_sensume+ rumersume+ rumersumes+adtes+ rumersumersume+ adtures+ ademe+ ademe+ adtes+ // Erhöhen der Zählervariable if (counter >= perode-1/0.01)//wenn eine perode abgetastet wurde { mittelwert_summe // counterSumme der Abstitwertte durch Anzahl der Abmitwerte_SF_signal_1 = mittelwert_summe;// Division der Amteltenwest_durme = ten = telten / telten beträgt zurücksetzen für è re durten = ten / tesn sumertelten = teneert f richten dures/ tesn// Zählervariable zurücksetzen für neue Berechnung } }}}else//wenn Unwuchtsignal über 10Hz (600 u/min) { dc_sf_signal_1 = AdcaResultRegs.ADCRESULT0;//gleichspannung des ersten perist der aktuelle Abwert}}sf_ase_DC (10u2)/unstatic tunt (1)/ei20Hz (10u/uelt)// Zählervariable für bereits abgetastete Werte static uint32 mittelwert_summe = 0;//变量 für das aufsumieren der Abstitwerte_summe += AdcaResults.ADCRESULT1;//fturmieren des aktuellen Abbwertes >2 Erhöhen/ eastere+ 计数器/eurtene+/ e+计数器/eetr/ eureriperipere+= 0.01 μ Zählervariable//除法器 Summe der Abstitwerte durch Anzahl der Abtichtwerte dc_sfon_2 = mittelwert_summe;// Gleichspannung des zweiten SFS beträgt ertelten Mitwert mittiwert_summe = 0;// Summenvariable zurücksetzen für neue Berechnung Zählervariable zurücksetzen für über /esfn = 0;// adt1 dc/uncheminuenu = 600 dc/esfuenu/esfr = 0//Gleichspannung des zweiten SFS ist der aktuelle Abchetwert }
您好 Devin、
感谢您的回复、
我使用的是定制板、通过万用表测量、我确保了 VERFHI 的3.3V 电压。
我还在 CPU2上运行 CPU2代码时检查了它们寄存器中的 ADCA 和 ADCD 设置、没有区别。
即使我随后在 CPU2上运行 CPU1代码、ADCA 和 ADCD 寄存器之间也没有区别。
此外、在这两种情况下、ADCD 重定位器本身也没有差异。 (如果 ADCD 模块工作正常、则 ADCD 寄存器的条件相同;如果 ADCD 模块工作不正确、则情况相同)。
ADCSOCxCTL 寄存器的行为与 ADCD 寄存器相同、模块 ADCA 和 ADCD 之间没有变化(在 CPU1代码运行后和 CPU2代码运行后)、在正确的工作情况和非正确的工作情况之间没有变化。
还有其他想法吗?
您好、Alexander、
绝对是一个奇怪的问题。
需要检查的其他事项:
您好、Alexander、
在数据表的"单端输入模型"部分中有一个 ADC 输入模型。 您应该假设 S+H 电容器、Ch、在 S+H 阶段开始时可以是任何值。
如果您使用分压器、则可能需要一个运算放大器、以显著增加 S+H 持续时间、或在 ADC 输入端放置一个大电容器。 增加 S+H 持续时间(通过增加 ACQPS)将使采样花费更长时间、从而增加采样到输出的延迟。 在引脚上添加一个大电容器将导致采样率限制、否则电荷将以比重新充电更快的速度从外部电容器中释放出来(并且输入带宽将显著减少、这可能是好的或坏的)。 运算放大器将需要电路板面积/成本。
奇怪的是、您有时会在不增加 S+H 持续时间的情况下获得良好的结果。 真正影响 S+H 持续时间的唯一因素是 ACQPS 设置和 SYSCLK 速度、您已确认这两种情况在两种复位场景之间是相同的?
Nirav、您好!
当我将 XCLKOUTDIV 保持在其值0x0时、我可以在刷写程序并启动内核之后直接在示波器上看到10MHz。 (故障情况;SYSCLK 不正确、因数恰好为20)
相同的0x0 XCLKOUTDIV 在内核的调试器复位后在示波器上显示200MHz。 (正确案例)
当我将 XCLKOUTDIV 设定为一个值0x3 (被8分频)时、我可以在刷写程序和启动内核之后直接在我的振荡器上看到1.25MHz。 (故障情况;SYSCLK 不正确、因数恰好为20)
相同的0x3 XCLKOUTDIV 在内核的调试器复位后在示波器上显示了25MHz。 (正确案例)
现在的问题是、我的 SYSCLK 在一种情况下(只刷写程序并启动内核)出现故障、而在另一种情况下(在内核的调试器复位然后启动内核之后)出现问题
我已经观察到、在正确的情况下、SYSPLLMULT 寄存器中的 IMULT 的十进制值为20、在故障情况下、它的值为0。 (为什么???) 这完全符合我所描述的失败。
感谢您提供更多建议、说明为什么我的 IMULT 在不同情况下有所不同。
我提前表示感谢
Nirav、您好!
实际上、在 SYSCLK 出现故障的情况下、SYSPLLMULT 寄存器中不仅有一个 IMULT 为0、CLKSRCCTL1寄存器中也有一个 OSCCLKSRCSEL 值为0。 在故障情况下、似乎没有进行完整的时钟配置。
[引述 USER="Nirav Gintala">您能否澄清:
PLL 配置何时发生? 根据您的代码片段、您会在代码开始时立即推出 XCLKOUT、因此最初您会在 GPIO73上看到10MHz (因为默认的 SYSCLK=INTOSC2=10MHz)、直到您将 PLL 配置为 SYSCLK=200MHz。[/QUERP]
我不知道 PLL 配置何时发生、我只是使用操作系统创建了一个 CCS 项目、并使用了给定的 CCS 模板。 然后、我配置了 app.cfg、正如您在上面的屏幕截图中看到的那样。 操作系统专家可能会说时钟配置何时实际发生。
[引用用户="Nirav Ginwala ]2. BIOS_start()函数的作用是什么? 它是否会将代码编程到闪存中、其中包含 PLL 配置的代码?
默认情况下,在创建带有操作系统的 CCS 工程时,会将 BIOS_start()函数插入主方法代码中。 我认为它开始了操作系统的调度、包括其所有任务、时钟、计时器等。 也许操作系统专家在这里也更有能力。
此致、Alexander
您好!
我使用的是6.52.00.12版。
亚历山大
您好!
我提出的另一项意见是:
当我只在 CPU1上刷写程序时、我可以看到 ClkCfgRegs 处于其正常状态、并且具有预期的值(OSCCLKSRC =外部振荡器、IMULT = 20)。
现在、当我在 CPU2上刷写程序并再次查看 CPU1以观察其寄存器时、我会看到其 ClkCfgRegs 保存默认值(OSCCLKSRC =内部振荡器2、IMULT = 0)、这些值是错误的。
现在,当我重新启动 CPU1并让它运行到其 main()时,值再次处于其正确状态。
因此、在我看来、CPU2的闪存/启动过程中(直到它在 main()之前停止)会清除 CPU1的 ClkCfgRegs 并/或将它们设置为默认值、因此我必须再次运行 CPU1的复位/启动过程以获得正确的时钟/ PLL 设置。
有人对此有什么想法吗?
向 Alexander 致意
您好!
很抱歉、没有解决。
我还尝试在主方法中使用 API 函数"手动"设置时钟。 在这种情况下、一切都按预期正常工作。
您好 Alex
int main() { system_printf ("enter main()\n"); InitGpio(); InitSysPll (1、20、0、 0);//手动代码 InitDrehzahlsensoren (); InitSF_DC_Test (); InitADC_ext (); InitHMS (); #ifdef _standalone IPCBootCPU2 (C1C2_Brom_bootmode_boot_boot_boot_f_ffrom _flash); #endif BIOS_start(); 返回(0); }