关于MACHINE_START (机器信息)

本文详细解析了TI平台的OMAP4430的机器实现核心文件中的配置与初始化过程,包括物理I/O映射、中断系统初始化以及板级初始化函数的实现。
(1)  这是TI平台的OMAP4430的机器实现核心文件/arch/arm/mach-omap2/board-omap3pandora.c 中的一段代码


MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")
    .phys_io    = 0x48000000,
    .io_pg_offst    = ((0xd8000000) >> 18) & 0xfffc,
    .boot_params    = 0x80000100,
    .map_io        = omap3pandora_map_io,
    .init_irq    = omap3pandora_init_irq,
    .init_machine    = omap3pandora_init,
    .timer        = &omap_timer,
MACHINE_END
     这里赋值了影射io、初始化irq、初始化机器等函数指针,其中的omap3pandora_map_io()、(影射io空间)
                                                                                                                   omap3pandora_init_irq()、(初始化板级的中断系统)
                                                                                                                    omap3pandora_init() 、(OMAPZOOM平台的板级初始化函数,如flash、usb、串口、camera、wifi等初始化)
      都是在此文件中实现的初始化函数
     omap_timer是为当前机器实现的定时器


Io地址影射

如果想叫处理器知道外围设备上的存储空间,首先要建立虚拟地址到总线地址的影射,总线地址到物里地址转换是硬件完成的。外围设备的存储范围是4G的顶端,而应设的虚拟地址时在896M以上,就是high_mm开始的地方,页表示在init_mm,这是专门为内核使用的页表,不与一般进程的页表在一起,所以在唤出时候,就找不到它的存在,所以内核页表示不会唤出的。同时虚拟地址也是在4G最后的128M里面,由一个虚拟存储区管理。

Offset  要应设的物理地址

Size    大小范围

返回影射成功的虚拟地址

Void* iormap(unsigned long offset ,unsigned longsize)

1       是对offset的一些测试,不能是1M下的应为这些已经建立影射,不能重复影射。

2       申请一个vm_struct结构,当然这个东西是在slab管理的,

3              申请完就获得了虚拟地址,就要在init_mm的页表里建立影射了。加一句,正是这里,所以有时候会出现页面异常,所以要同步



(2)(这是转载的s3c2410的平台机器信息)

MACHINE_START(VR1000, "Thorcom-VR1000")
 /* Maintainer: Ben Dooks < ben@simtec.co.uk > */
 .phys_ram = S3C2410_SDRAM_PA,
 .phys_io = S3C2410_PA_UART,
 .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
 .boot_params = S3C2410_SDRAM_PA + 0x100,
 .map_io  = vr1000_map_io,
 .init_irq = s3c24xx_init_irq,
 .timer  = &s3c24xx_timer,
MACHINE_END
 
这两个是宏定义 原型为
#define MACHINE_START(_type,_name)  /
const struct machine_desc __mach_desc_##_type /
 __attribute__((__section__(".arch.info.init"))) = { /
 .nr  = MACH_TYPE_##_type, /
 .name  = _name,
#define MACHINE_END    /
};
struct machine_desc 的原型为:
 
struct machine_desc {
 /*
  * Note! The first five elements are used

  * by assembler code in head-armv.S
  */
 unsigned int  nr;  /* architecture number */
 unsigned int  phys_ram; /* start of physical ram */
 unsigned int  phys_io; /* start of physical io */
 unsigned int  io_pg_offst; /* byte offset for io
       * page tabe entry */
 const char  *name;  /* architecture name */
 unsigned long  boot_params; /* tagged list  */
 unsigned int  video_start; /* start of video RAM */
 unsigned int  video_end; /* end of video RAM */
 unsigned int  reserve_lp0 :1; /* never has lp0 */
 unsigned int  reserve_lp1 :1; /* never has lp1 */
 unsigned int  reserve_lp2 :1; /* never has lp2 */
 unsigned int  soft_reboot :1; /* soft reboot  */
 void   (*fixup)(struct machine_desc *,
      struct tag *, char **,
      struct meminfo *);
 void   (*map_io)(void);/* IO mapping function */
 void   (*init_irq)(void);
 struct sys_timer *timer;  /* system tick timer */
 void   (*init_machine)(void);
};
 

MACH_TYPE_SMDK2410定义在arch/include/asm-arm/mach-types.h内,值为193.
/* arch/include/asm-arm/mach-types.h */
#define MACH_TYPE_SMDK2410             193
这个值是机器的类型值,编译时由arch/arm/tool/mach-types里面定义的数据生成的。
/* arch/arm/tool/mach-types */
smdk2410  ARCH_SMDK2410  SMDK2410  193

由上发现,MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。

各个成员函数在不同时期被调用:
1. .init_machine 在 arch/arm/kernel/setup.c 中被 customize_machine 调用,放在 arch_initcall() 段里面,会自动按顺序被调用。
2. init_irq在start_kernel() --> init_IRQ() --> init_arch_irq() 被调用
3. map_io 在 setup_arch() --> paging_init() --> devicemaps_init()被调用
其他主要都在 setup_arch() 中用到


请你分析这段代码:import pandas as pd # 读取Excel文件,构建工序字典(工序名称: {机器: 加工时间}) file_path = r'F:\学校文件\论文\草稿\mk01.xlsx' df = pd.read_excel(file_path, sheet_name='Sheet1') process_dict = {} for idx, row in df.iterrows(): job = row['MK01'] op = row['gx'] machines = {} for col in df.columns[2:]: # 从M1到M6 time = row[col] if pd.notna(time): machines[col] = time process_dict[op] = machines # 假设这里的工序编码和机器编码是编码程序的输出 operation_sequence = [10, 5, 3, 10, 3, 10, 3, 1, 6, 10, 5, 6, 6, 9, 4, 2, 8, 7, 1, 7, 5, 9, 10, 1, 9, 5, 10, 8, 3, 1, 6, 3, 6, 8, 2, 6, 7, 2, 9, 4, 7, 1, 5, 9, 4, 4, 5, 8, 4, 7, 1, 8, 2, 9, 2] # 示例工序编码 machine_code = [6, 2, 2, 3, 6, 5, 1, 1, 6, 6, 1, 1, 3, 6, 1, 2, 6, 6, 5, 4, 2, 1, 4, 3, 4, 1, 4, 3, 6, 1, 2, 5, 1, 1, 3, 4, 3, 1, 1, 2, 5, 3, 4, 6, 3, 5, 3, 2, 6, 3, 4, 4, 4, 4, 1] # 示例机器编码 # 初始化变量 jobs = df['MK01'].unique() job_numbers = {job: int(job[3:]) for job in jobs} job_operations = {job: len(df[df['MK01'] == job]) for job in jobs} machine_start_times = [0] * 6 # 每台机器的当前可用时间 job_current_op = {job: 0 for job in jobs} total_time = 0 machine_loads = [0] * 6 # 初始化每台机器的负载 # 解码过程 for i in range(len(operation_sequence)): job_char = operation_sequence[i] job = f'job{job_char}' op_index = job_current_op[job] op_name = f'O{job_char}{op_index + 1}' job_current_op[job] += 1 machine_index = machine_code[i] - 1 # 机器编号从1开始,转换为索引 machine = f'M{machine_index + 1}' # 检查该工序是否支持在所选机器上加工 if machine in process_dict[op_name]: # 获取该工序在所选机器上的加工时间 processing_time = process_dict[op_name][machine] # 确定该工序的开始时间,取决于机器的可用时间和工件上一工序的完成时间 job_last_finish_time = max( [machine_start_times[j] for j in range(6) if op_name in process_dict and machine in process_dict[op_name]]) start_time = max(machine_start_times[machine_index], job_last_finish_time) # 更新机器的可用时间 machine_start_times[machine_index] = start_time + processing_time # 更新总加工时间 total_time = max(total_time, machine_start_times[machine_index]) # 更新机器的负载 machine_loads[machine_index] += processing_time print( f"工件 {job} 的工序 {op_name} 在机器 {machine} 上,从时间 {start_time} 开始加工,加工时间为 {processing_time}") else: print(f"错误:工序 {op_name} 不支持在机器 {machine} 上加工。") print(f"总加工时间: {total_time}") # 输出每台机器的负载 for i in range(6): print(f"机器 M{i + 1} 的负载: {machine_loads[i]}")
最新发布
03-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值