threadx学习笔记专业资料.doc
《threadx学习笔记专业资料.doc》由会员分享,可在线阅读,更多相关《threadx学习笔记专业资料.doc(48页珍藏版)》请在咨信网上搜索。
threadx学习笔记(一) tx_ill.s文献用来解决初始化过程中的汇编语言,它是面向解决器和开发工具的。 Void_tx_initialize_low_level{ 1、CPSCR|= FIQ_ MODE,SET SP_fiq; 2、CPSCR|=IRQ_MODE,SET SP_irp; 3、CPSCR|=SVC_MODE,SET SP_svc; 4、设立中断向量表IRQ_TABLE; 5、设立内部TIMER线程的堆栈起始地址,堆栈大小和优先级::tx_timer_stack_start,_tx_timer_stack_size,_tx_timer_priorit; 6、设立初始化后未使用内存地址的初始值_tx_initialize_unused_memory; } Tx_tcs.s负责在中断发生时对上次的运营现场进行保存,它保存中断上下文,为了不覆盖R14_irq离得中断返回地址,TCS的返回是通过跳到__tx_irq_processing_return地址做到的。Tx_TCR.S负责中断解决程序执行完后的解决。 Void _tx_thread_context_save{ 1、把表达中断嵌套个数的变量 _tx_thread_system_state++; 2、if _tx_thread_system_state>1,PUSH R0-R3,CPSR,R14 in IRQ stack,B __tx_irq_processing_return; 3、else if _tx_thread_current_ptr=0判断是否有线程正在运营,if not ,B _tx_irq_processing_return; 4、else,PUSH Context_irq in thread’s stack,SP_thread=new SP,B _tx_irq_processing_return; } 由于R13和R14在不同的CPU模式下相应的是不同的物理寄存器,所以若要得到中断前的线程堆栈指针,需要先返回到该线程的运营模式,同时严禁中断,取值后再返回到终端模式。R14_irq保存的是终端发生时PC值+8,R14_svc保存得失中断前线程自己的返回地址。所以在中段上下文中,(R14_irq-4)应当存在中断地址,而R14_svc存在R14的位置。 Void _tx_thread_context_restore{ 1、_tx_thread_system_state--,if _tx_thread_system_state>0,POP R0-R3,CPSR,R14 from IRQ stack,BX R14; 2、else if _tx_thread_current_ptr=0?if =0 CPSR|=VC_MODE,CPSR|=TX_INT_ENABLE,跳到线程调度程序B _tx_thread_schedule; 3、if!=0,则判断线程抢占是否严禁 if _tx_thread_preempt_disable=0?if!=0,POP Context_irq from thread’s stack,BX R14; 4、if=0,_tx_timer_time_slice=new value,_tx_thread_current_ptr=0,CPSR|=SVC_MODE,设立堆栈指针为系统指针SP=SP_svc,CPSR|=TX_INT_ENABLE; 5、B _tx_thread_schedule; } Tx_tsr.s用于从线程退回到系统态,负责保存线程的最小语境并退回到Threadx的调度循环状态。它保存的上下文是请求上下文。 Void _tx_thread_system_return{ 1、 PUSH Context_request:in thread’s stack,CPSR|=TX_INT_DISABLE; 2、 _tx_thread_current_ptr->SP=SP,CPSR|=SVC_MODE; 3、 设立堆栈指针为系统指针SP=SP_svc,_tx_thread_current_ptr=0,CPSR|=TX_INT_ENABLE; 4、 B _tx_thread_schedule; } 由于用户模式不能直接更改CPSR来关断的,所以要通过SWI指令进入特权模式,并且特权模式和用户模式的SP相应不同的物理寄存器,所以要在转入系统模式取得用户模式下SP,最后再回到特权模式。 TX_TS.S负责调度和恢复就绪的优先级最高的线程的最后语境。 Void _tx_thread_schedule{ 1、 while(_tx_thread_execute_ptr=0); 2、 CPSR|=TX_INT_DISABLE,_tx_threadx_current_ptr=_tx_thread_execute_ptr; 3、 _tx_thread_current_ptr->TX_run_count++,_tx_timer_time_slice=_tx_thread_current_ptr->tx_time_slice; 4、 If线程堆栈的中断类型=1,restore Context_irq,else restore Context_request; } Tx_tic.s用于开中断和关中断。 Unint _tx_thread_interrupt_control(unint new _posture){ 1、 R1=CPSR; 2、 SWI; 3、 CPSR|=RO=new posture; 4、 R0=R1,R0为返回值; } 移植该函数时,针对不同的解决器,应盖根据准热爱寄存器CPSR的中断严禁未来设立开关中断向量,重要修改TX_PORT.H中的TX_INT_ENABLE和TX_INT_DISABLE.R0用来传递的参数和结果。 Tx_tsb.s负责创建每个线程的初始堆栈结构,这个初始的结构在线程创建时会引起中断上下文返回到_tx_thread_shell_entry函数的开头。然后这个函数调用指定线程入口函数。其中断类型设立为1,表达中断上下文。 Void _tx_thread_stack_build(TXTHREAD *thread_ptr,void (*function)(void)){ 1、 保证堆栈起始地址八字节对齐; 2、 中断地址存入线程调用的入口地址PUSH function_ptr; 3、 R0-R12,R14的初始值都设立为0,PUSH初始值; 4、 要存入堆栈的CPSR值设立为用户模式,开中断,标志位清零,R1=USER_MODE,PUSH R1; 5、 Thread_ptr->sp=new SP; } 当解决一个低档的中断时,tx_tpc.s决定是否发生抢占,它是可选的,大多数端口都用不到。TX_TIMIN.S负责解决定期中断。这两个函数只要将它们翻译成相应ARM汇编语言就可以了。 threadx学习笔记(二)-1 tx_kernel_enter();进入threadx核 tx_kernel_enter() void tx_kernel_enter(void) 所属文献 调用者 开关量 demo.C 启动代码 无 操作系统一方面从从量表直接进入该函数,在函数以前没有进行任何的硬件及软件的初始化!该函数重要包含_tx_initialize_low_level(),_tx_initialize_high_level(),tx_application_define(_tx_initialize_unused_memory),_tx_thread_schedule()。 VOID _tx_initialize_kernel_enter(VOID) { /*拟定编译器是否已经初始化过 */ if (_tx_thread_system_state != TX_INITIALIZE_ALMOST_DONE) { /* 没有初始化的话执行下面程序 */ /* 设立系统状态变量来表达现正在解决过程中 注意该变量在后边的中断嵌套中会使用 */ _tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS; /* 进行一些基本硬件设立,启动程序等 */ _tx_initialize_low_level(); /*进行一些高级的初始化*/ _tx_initialize_high_level(); } /*设立系统状态变量来表达现正在解决过程中 注意该变量在后边的中断嵌套中会使用*/ _tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS; /* 调用初始化中提供的应用程序 把第一个未使用的变量地址传送给它 */ tx_application_define(_tx_initialize_unused_memory); /*设立系统壮伟进入线程调度做准备*/ _tx_thread_system_state = TX_INITIALIZE_IS_FINISHED; /* 进入线程循环开始执行线程 */ _tx_thread_schedule(); } _tx_initialize_low_level() void tx_kernel_enter(void) 所属文献 调用者 开关量 tx_till.s 启动代码 无 该函数实现对FIQ、IRQ和SVC模式下的sp寄存器的初始化,并对定期堆栈的基地址、大小和定期优先级变量进行初始化。 /* 进行一些基本硬件设立,启动程序等 */ /*该函数在文献tx_ill.s文献中*/ _tx_initialize_low_level(); ;/* VOID _tx_initialize_low_level(VOID) ;{ EXPORT _tx_initialize_low_level _tx_initialize_low_level ; /* 保存系统堆栈指针. */ ; /* _tx_thread_system_stack_ptr = (VOID_PTR) A7 (SP); */ ; /*设立各个模式下的sp(堆栈指针)*/ ; /* We must be in SVC mode at this point! */ ; LDR a2, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area LDR a3, [pc, #FIQ_STACK_SIZE-.-8] ; 获得FIO堆栈地址(这里没有弄明白,有待?) MOV a1, #FIQ_MODE ; 设立FIQ_MODE MSR CPSR_c, a1 ; 进入FIQ模式 ADD a2, a2, a3 ;计算FIQ堆栈的开始 BIC a2, a2, #3 ; 将a2的低两位清零保证堆栈的的开始为long对齐 SUB a2, a2, #4 ; 往回退一个字 MOV sp, a2 ; 建立FIQ 堆栈指针(即FIQ模式的sp) MOV sl, #0 ; Clear sl(R10) MOV fp, #0 ; Clear fp(R11) LDR a3, [pc, #SYS_STACK_SIZE-.-8] ;获得 IRQ (system stack size) MOV a1, #IRQ_MODE ; 建立IRQ模式的 CPSR MSR CPSR_c, a1 ; 进入IRQ模式 ADD a2, a2, a3 ; 计算IRQ stack的开始 BIC a2, a2, #3 ; 将a2的低两位清零保证堆栈的的开始为long对齐 SUB a2, a2, #4 ; 往回退一个字 MOV sp, a2 ; 建立 IRQ 堆栈指针 MOV a1, #SVC_MODE ; 建立SVC模式的CPSR MSR CPSR_c, a1 ; 进入 SVC模式 LDR a4, [pc, #SYS_STACK_PTR-.-8] ; 获得stack 指针 STR a2, [a4, #0] ; 保存系统堆栈 ; ; /* Save the system stack pointer. */ ; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); ; LDR a2, [pc, #SYS_STACK_PTR-.-8] ; 获得系统堆栈指针的地址 LDR a1, [a2, #0] ; 获得系统堆栈指针 ADD a1, a1, #4 ; 增长一个long长度 ; ; /* Pickup the first available memory address. */ ; ; /* Allocate space for the timer thread's stack. */ ; _tx_timer_stack_start = first_available_memory; ; _tx_timer_stack_size = stack_size; ; _tx_timer_priority = 0; ; LDR a2, [pc, #TIMER_STACK-.-8] ; 获得定期堆栈指针地址 LDR a4, [pc, #TIMER_STACK_SIZE-.-8] ; 获得定期堆栈大小地址 LDR a3, [pc, #TIM_STACK_SIZE-.-8] ; 获得实际定期堆栈大小 STR a1, [a2, #0] ;将定期堆栈的基地址放在堆栈指针地址所相应的内存中 STR a3, [a4, #0] ; 存储定期器堆栈大小 ADD a1, a1, a3 ; 新的空内存地址 LDR a2, [pc, #TIMER_PRIORITY-.-8] ; 获得定期器优先级地址 MOV a3, #0 ; 获得定期器线程优先级 STR a3, [a2, #0] ; 存储定期器线程优先级 ; /*保存第一个变量内存地址. */ ; _tx_initialize_unused_memory = (VOID_PTR) System Stack + Timer Stack; ; LDR a3, [pc, #UNUSED_MEMORY-.-8] ;获得没有使用的内存指针地址 STR a1, [a3, #0] ; 保存第一个空内存地址 ; /* 建立周期性的定期中断. */ STMDB {LR} //让lr入栈,保护lr BL TargetInit //TargetInit()为C语言编写的中断定期函数 LDMIA {lr} //让lr出栈 在这里加上ARM定期器已实现周期性的中断 ; /* Done, return to caller. */ ; MOV pc, lr ; Return to caller ;} __tx_irq_handler 所属文献 调用者 开关量 tx_till.s IRQ中断 无 该函数是在定期中断后调用,该函数调用了_tx_thread_context_save函数(包含在tx_tcs.s中),该函数又调用到__tx_irq_processing_return函数处(包含在tx_till.s) EXPORT __tx_irq_handler EXPORT __tx_irq_processing_return __tx_irq_handler ; ; /* 调用函数保存线程上下文环境. */ B _tx_thread_context_save __tx_irq_processing_return ; ; /* At this point execution is still in the IRQ mode. The CPSR, point of ; interrupt, and all C scratch registers are available for use. In ; addition, IRQ interrupts may be re-enabled - with certain restrictions - ; if nested IRQ interrupts are desired. Interrupts may be re-enabled over ; small code sequences where lr is saved before enabling interrupts and ; restored after interrupts are again disabled. */ ; ; /* For debug purpose, execute the timer interrupt processing here. In ; a real system, some kind of status indication would have to be checked ; before the timer interrupt handler could be called. */ ; BL clearflag ;清除中断标志位很重要(自己移植时加的,位置是否恰当?) BL _tx_timer_interrupt ; 定期中断解决函数 ; ; /* 系统线程上下文环境恢复函数 */ B _tx_thread_context_restore _tx_timer_interrupt 所属文献 调用者 开关量 tx_timin.s 启动代码 无 该函数重要是中断后将系统时钟加1,时间切片减1。定期部分比较多,没有完全看明白。 IMPORT _tx_timer_time_slice IMPORT _tx_timer_system_clock IMPORT _tx_timer_current_ptr IMPORT _tx_timer_list_start IMPORT _tx_timer_list_end IMPORT _tx_timer_expired_time_slice IMPORT _tx_timer_expired IMPORT _tx_timer_thread IMPORT _tx_thread_current_ptr IMPORT _tx_thread_time_slice IMPORT _tx_thread_resume IMPORT _tx_thread_preempt_disable ; PRESERVE8 AREA |C$$code|, CODE, READONLY |x$codeseg| DATA ;VOID _tx_timer_interrupt(VOID) ;{ EXPORT _tx_timer_interrupt _tx_timer_interrupt ; ; /* Upon entry to this routine, it is assumed that context save has already ; been called, and therefore the compiler scratch registers are available ; for use. */ ; ; /* Increment the system clock. */ ; _tx_timer_system_clock++; ; LDR a2, [pc, #SYSTEM_CLOCK-.-8] ; 获得系统时钟地址 LDR a1, [a2, #0] ; 获得系统时钟 ADD a1, a1, #1 ; 将系统时钟加1 STR a1, [a2, #0] ; 存储新的系统时钟时间 ; ; /* Test for time-slice expiration. */ ; if (_tx_timer_time_slice) ; { ; LDR a4, [pc, #TIME_SLICE-.-8] ; 获得链表中的定期切片数地址 LDR a3, [a4, #0] ; 获得定期切片数的值 CMP a3, #0 ; 定期切片是否有效,>0有效,=0无效 BEQ __tx_timer_no_time_slice ; =0时,跳到__tx_timer_no_time_slice处 ; /* 时间切片减1. */ ; _tx_timer_time_slice--; ; SUB a3, a3, #1 ; 时间切片值减1 STR a3, [a4, #0] ; 存储新的时间切片值 ; ; /* 检查是否到期. */ ; if (__tx_timer_time_slice == 0) ; CMP a3, #0 ; >0还是=0? BNE __tx_timer_no_time_slice ; 假如>0, ;当没有定期切片时,将定期切片数标志位置1,表达链表中没有切片了。 ; /* Set the time-slice expired flag. */ ; _tx_timer_expired_time_slice = TX_TRUE; ; LDR a4, [pc, #EXPIRED_TIME_SLICE-.-8] ; 获得定期切片数是否为0标志地址 MOV a1, #1 ; 将标志设为1 STR a1, [a4, #0] ; 设立届时标志 ; ; } ; __tx_timer_no_time_slice ; ; /* Test for timer expiration. */ ; if (*_tx_timer_current_ptr) ; { ; LDR a2, [pc, #TIMER_CURRENT_PTR-.-8] ; 获得的是_tx_timer_current_ptr的地址 ;而TIMER_DECLARE TX_INTERNAL_TIMER **_tx_timer_current_ptr ; LDR a1, [a2, #0] ; 获得当前的_tx_timer_current_ptr LDR a3, [a1, #0] ; 获得定期列表的入口定期切片指针 CMP a3, #0 ;链表中是否有定期切片存在 BEQ __tx_timer_no_timer ; 不存在, 调用__tx_timer_no_time将 ;_tx_timer_current_ptr++ ; ; /* Set expiration flag. */ ; _tx_timer_expired = TX_TRUE; ; LDR a4, [pc, #EXPIRED-.-8] ; Pickup expriation flag address MOV a3, #1 ; Build expired value STR a3, [a4, #0] ; Set expired flag B __tx_timer_done ; Finished timer processing ; ; } ; else ; { __tx_timer_no_timer ; ; /* No timer expired, increment the timer pointer. */ ; _tx_timer_current_ptr++; ; ADD a1, a1, #4 ; Move to next timer ; ; /* Check for wrap-around. */ ; if (_tx_timer_current_ptr == _tx_timer_list_end) ; LDR a4, [pc, #LIST_END-.-8] ; Pickup addr of timer list end LDR a3, [a4, #0] ; Pickup list end CMP a1, a3 ; Are we at list end? BNE __tx_timer_skip_wrap ; No, skip wrap-around logic ; ; /* Wrap to beginning of list. */ ; _tx_timer_current_ptr = _tx_timer_list_start; ; LDR a4, [pc, #LIST_START-.-8] ; Pickup addr of timer list start LDR a1, [a4, #0] ; Set current pointer to list start ; __tx_timer_skip_wrap ; STR a1, [a2, #0] ; Store new current timer pointer ; } ; __tx_timer_done ; ; ; /* See if anything has expired. */ ; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) ; { ; LDR a4, [pc, #EXPIRED_TIME_SLICE-.-8] ; Pickup addr of expired flag LDR a3, [a4, #0] ; Pickup time-slice expired flag CMP a3, #0 ; Did a time-slice expire? BNE __tx_something_expired ; If non-zero, time-slice expired LDR a2, [pc, #EXPIRED-.-8] ; Pickup addr of other expired flag LDR a1, [a2, #0] ; Pickup timer expired flag CMP a1, #0 ; Did a timer expire? BEQ __tx_timer_nothing_expired ; No, nothing expired ; __tx_something_expired ; ; STR lr, [sp, #-4]! ; Save the lr register on the stack ; ; /* Did a timer expire? */ ; if (_tx_timer_expired) ; { ; LDR a2, [pc, #EXPIRED-.-8] ; Pickup addr of expired flag LDR a1, [a2, #0] ; Pickup timer expired flag CMP a1, #0 ; Check for timer expiration BEQ __tx_timer_dont_activate ; If not set, skip timer activation ; ; /* Increment the preempt disable counter in preparation for ; thread resumption. */ ; _tx_thread_preempt_disable++; ; LDR a4, [pc, #PREEMPT_DISABLE-.-8] ; Pickup addr of preempt disable LDR a3, [a4, #0] ; Pickup actual flag ADD a3, a3, #1 ; Incrment the preempt disable count STR a3, [a4, #0] ; Store it back ; ; /* Activate the system timer thread. */ ; _tx_thread_resume(&_tx_timer_thread); ; LDR a1, [pc, #TIMER_THREAD-.-8] ; Get timer thread control block addr BL _tx_thread_resume ; Call thread resume to wake up the ; timer thread ; ; } __tx_timer_dont_activate ; ; /* Did time slice expire? */ ; if (_tx_timer_expired_time_slice) ; { ; LDR a4, [pc, #EXPIRED_TIME_SLICE-.-8] ; Pickup addr of time-slice expired LDR a3, [a4, #0] ; Pickup the actual flag CMP a3, #0 ; See if the flag is set BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing ; ; /* Time slice interrupted thread. */ ; if (!_tx_thread_time_slice()) ; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_time_slice; ; BL _tx_thread_time_slice ; Call time-slice processing CMP a1, #0 ; Check return status BNE __tx_timer_not_ts_expiration ; If time-sliced, skip reset processing LDR a2, [pc, #CURRENT_PTR-.-8] ; Pickup addr of current thread pointer LDR a1, [a2, #0] ; Pickup thread pointer LDR a3, [a1, #24] ; Pickup fresh time-slice for thread ; (a fresh time slice was setup in ; the _tx_thread_time_slice function) LDR a4, [pc, #TIME_SLICE-.-8] ; Pickup addr of time-slice variable STR a3, [a4, #0] ; Setup new time-slice ; ; } ; __tx_timer_not_ts_expiration ; LDR a4, [pc, #EXPIRED_TIME_SLICE-.-8] ; Pickup address of expired time-slice flag MOV a1, #0 ; Clear value STR a1, [a4, #0] ; Clear time-slice expired flag ; LDR lr, [sp], #4 ; Recover lr register ; ; } ; __tx_timer_nothing_expired ; MOV pc, lr ; Return to caller ; ;} TIME_SLICE DCD _tx_timer_time_slice SYSTEM_CLOCK DCD _tx_timer_system_clock TIMER_CURRENT_PTR DCD _tx_timer_current_ptr LIST_START DCD _tx_timer_list_start LIST_END DCD _tx_timer_list_end EXPIRED_TIME_SLICE DCD _tx_timer_expired_time_slice EXPIRED DCD _tx_timer_expired TIMER_THREAD DCD _tx_timer_thread CURRENT_PTR DCD _tx_thread_current_ptr THREAD_TIME_SLICE DCD _tx_thread_time_slice RESUME DCD _t- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- threadx 学习 笔记 专业 资料
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文