Dynamic scheduling of real time control systems

92 285 0
Dynamic scheduling of real time control systems

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

DYNAMIC SCHEDULING OF REAL-TIME CONTROL SYSTEMS QIAN LIN A DISSERTATION SUBMITTED FOR THE DEGREE OF MASTER OF ENGINEERING DEPARTMENT OF MECHANICAL ENGINEERING NATIONAL UNIVERSITY OF SINGAPORE 2004 Acknowledgements Firstly, I would like to thank my two supervisors, Dr Peter C Y Chen and Prof A N Poo, for their instructive guidance and constant personal encouragement during every stage of this research I greatly respect their inspiration, professional dedication and scientific ethos I am also fortunate to meet so many talented fellows in the Control Laboratory, who make the two years exciting and the experience worthwhile Everybody has been most helpful and friendly My gratitude also goes to Mr C S Yee, Mrs Ooi, Ms Tshin and Mr Zhang for the helps on facility support in the laboratory so that the project may be completed smoothly ii Table of contents Acknowledgements ii Summary vi Introduction 1.1 Problem definition 1.2 Motivation 1.3 Methodology and result overview 1.4 Organization Background 2.1 Discrete control design 2.1.1 Discrete-time design 2.1.2 Discretization of continuous-time design 2.1.3 Algorithm implementation 2.2 Task attributes 2.3 Real-time scheduling 2.3.1 Scheduling algorithm 2.3.2 Schedulability 2.4 Flexible scheduling Related Works 3.1 Control scheduling co-design 3.2 Control integral scheduling 3.3 Feedback scheduling 3.4 QoS adaptation Aperiodic Sampling Based on Task Urgency 4.1 Performance index function 4.1.1 Performance change rate 4.2 Task urgency 4.2.1 On-line amplitude detection 4.3 Aperiodic sampling based on task urgency 4.3.1 Simulation example 1 7 11 12 12 13 14 16 19 19 20 21 22 25 26 37 38 41 42 43 iii 4.4 Summary 45 Dynamic Scheduling 5.1 Scheduling algorithm 5.2 Implementation issues 5.2.1 Sampling frequency bounds 5.2.2 FDPCR approximation 5.3 Simulation example 5.4 Results analysis 47 47 50 50 51 51 56 Conclusions 58 References 60 Appendices 64 A Least Squares Approximation 65 B Source Code for Simulation B.1 Simulation code for single-task systems B.1.1 Single task initial function B.1.2 Single task control algorithm B.1.3 Single task on-line urgency computation B.2 Simulation code for three-task systems B.2.1 Three control tasks initial function B.2.2 Control algorithm for task and B.2.3 Control algorithm for task B.2.4 Multi-task system on-line urgency computation B.2.5 Multi-task system CPU allocation B.3 Kernel functions 68 68 68 69 70 71 71 72 73 74 74 75 iv Summary In a typical real-time digital control system, a microprocessor is often embedded in the system to generate the control signal periodically The number of such computation per unit time is referred to as the sampling frequency It is a known fact that sampling frequency of a control system has direct effect on the system’s performance Normally higher sampling frequency leads to better performance However, a higher sampling frequency implies that more computational resources are needed, which increases the workload of the computer Therefore, in design and implementation of digital control systems, there exists a trade-off between performance of a system and computational resources required in order to achieve such performance In this thesis, we design the sampling frequencies by solving this trade-off problem on-line The objective is to optimize the overall control system’s performance by allocating CPU time efficiently Studies on the trade-off between the task sampling frequency and system performance have been reported in the literature In one approach (Seto et al., 1996), a set of optimal task periods is chosen to minimize a given control cost function under certain scheduling constraints This optimization problem is based on the convex function of control performance and sampling frequency However, this offline approach to varying task period did not consider change in task urgency in real-time This approach was extended such that allocation of processor utilization is made on-line with periodic adjustment (Shin and Meissner, 1999) The extended approach uses a performance index to weight a task’s urgency to the system, and v consequently determines the optimal task periods However, determination of the coefficients in scaling the task urgency remains ad hoc In this thesis, a systematic way to evaluate the task urgency change in real-time is developed Based on this on-line task urgency, a dynamic scheduling algorithm for on-line adjustment of task periods is proposed An aperiodic sampling method is employed in the dynamic scheduling algorithm to improve the efficiency of CPU usage Task periods are regarded as variables dependent on the urgency of the tasks and system scheduling constraints Simulation results are presented to compare our on-line dynamic scheduling algorithm with the off-line optimal designed scheduling algorithm of (Seto et al., 1996) The simulation results show that with on-line dynamic scheduling the system performance is improved vi List of Figures 1.1 Signals in a computer control system 2.1 Illustration of the time relationship between deadline, response time, and input-output latency for a control task 13 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 Performance index function with sampling frequency as variable Performance index function with time as variable Detailed performance index Illustration of Jd (t, f ) definition J (t, f ) with both time and sampling frequency as variables PI function with both time and sampling frequency as variables Control signal and sampling frequencies using aperiodic sampling Control output signal and CPU usage 28 29 30 31 33 34 46 46 5.1 5.2 5.3 5.4 Dynamical scheduling algorithm The three-task computer-control system The approximated r(f ) Outputs of three-task control system 50 52 53 55 A.1 Jd curve approximation by LS 67 vii List of Tables 1.1 Implementation of a real-time control system in loops 4.1 4.2 4.3 Data for J (t, f ) with respect to time and frequency variables 32 Approximation error for J (t, f ) function 36 Amplitude of the frequency components on-line computation 42 5.1 5.2 5.3 Dynamic scheduling algorithm implementation 49 parameters of the three control tasks 52 Comparison on the performance indices 55 A.1 Data for Jd (f ) 66 A.2 Matlab code for solving Equation (A.5) 67 viii Chapter Introduction 1.1 Problem definition Computer control systems constitute a large part of all real-time systems They have been widely applied in industry ranging from flight control to micro-surgery A computer control system consists of two major parts: the physical system and the computer system The physical system includes the physical plants to be controlled, sensors to provide information on the plants’ real time behavior, and actuators to drive the physical plants The computer system usually consists of an embedded microcomputer, which is used to compute control commands for the physical plants Due to the discrete nature of computer, a computer control system has to sample the analog signals of the plants An illustration of a computer control system is given in Figure 1.1 In each period for each physical plant, an analog to digital (A-D) converter transforms the continuous output signal y(t) into digital signal y(k) that can be handled by computer After the computer calculates the control signal according to the control algorithm, the control signal is transformed into continuous signal u(t) by a digital to analog (D-A) converter and fed to the plant y(t) u(t) t t Plant n u(t) y(t) Plant Holder sampler D-A Computer u(k) A-D y(k) u(k) y(k) t t Figure 1.1: Signals in a computer control system The continuous signal y(t) becomes the discrete signal y(k) through sampler; u(k) is converted as u(t) through a holder with zero order The computation for control signal is implemented as a task that should be executed by the computer at a fixed rate, which means that the controller requests y(k) (shown in Figure 1.1) at equal intervals of time The computation task is modelled as a periodic task characterized by several attributes: the period of task T , which equals to the sampling period; each task requires specific computational time to execute the control algorithm once, denoted as e, where e < T ; each task also has an associate deadline, denoted as D The pseudo-code for a control loop in a real-time system is shown as in Table 1.1 In a real-time system, a computer controller is usually part of the system The computation resource is limited due to the expense and the physical space All s.value =fu ; end s.signal = s.signal (p.calfre: p.veclong); else s.value = p.h; end set param (gcs, ‘UserData’, rtsys); q=size (s.cput, 2); if q==0 s.cput= exectime; s.tput = p.h; else s.cput= [s.cput s.cput (q)+ exectime]; s.tput = [s.tput s.tput (q)+p.h]; end case 2, analogOut (p.uChan, s.u); if (s.value∼= p.h) setValue (s.value); end end B.1.3 Single task on-line urgency computation function values = calculatefft (signal, BW) rtsys = get param (gcs, ‘UserData’); period = rtsys.tasks{rtsys.running}.period; signal=signal-mean (signal); signal= [signal(1)· ones(1,200) signal signal(1)· ones(1,200)]; N=size (signal, 2); ; fs = period Y =fft(signal,N); P yy = Y · conj(Y )/N ; f = fs · (0 : N/2)/N ; f1 = ; period N · fc i= ; fs Ai = P yy(i); I= AAmi 70 B.2 B.2.1 Simulation code for three-task systems Three control tasks initial function The initial function for three-tasks control system defines the parameters for three control tasks function rtsys = threeservos init rtsys.tickSize = 0.001; rtsys.prioFun = ‘prioEDF’; rtsys.distribCpu= ‘distribCpu’; rtsys.nbrOfInputs = 6; rtsys.nbrOfOutputs = 3; states.signal = [ ]; params.veclong = 128; params.calfre =2; states.BW = [ ]; states.time = [ ]; states.j=0; states.jcost=[ ]; states.cput=[ ]; states.tput=[ ]; T = 0.125; params.cutoff = 0.4; params.rChan = 1; params.yChan = 2; params.uChan = 1; params.h = T; params.α= 0.64; params.β= 0.12; states.Eold = 0; states.Uold = 0; states.Tm =T; pidCode1 = code ({‘pid1’}, states, params); pidTask1 = task (‘pidTask1’, pidCode1, T, T); T = 0.03; params.cutoff = 0.8; params.rChan = 3; params.yChan = 4; params.uChan = 2; states.Eold = 0; states.Xold = 0; states.Tm =T; params.h = T; params.α= 40.3; params.β= 0.36; 71 pidCode2 = code ({‘pid2’}, states, params); pidTask2 = task (‘pidTask2’, pidCode2, T, T); T = 0.125; params.cutoff = 0.4; params.rChan = 5; params.yChan = 6; params.uChan = 3; states.Eold = 0; states.Uold = 0; states.Tm =T; params.h = T; params.α= 0.64; params.β= 0.12; pidCode3 = code ({‘pid3’}, states, params); pidTask3 = task (‘pidTask3’, pidCode3, T, T); rtsys.tasks = {pidTask1 pidTask2 pidTask3}; B.2.2 Control algorithm for task and function [exectime, s] = pid (flag, s, p) switch flag, case 1, r = analogIn (p.rChan); y = analogIn (p.yChan); rtsys = get param (gcs, ‘UserData’); p.h = rtsys.tasks{rtsys.running}.period; exectime = rtsys.tasks{rtsys.running}.exectime; E = (r − y); k = 2.71−2·p.h ; a = k; b = 0.5 · (1 + k); u = a · s.U old + · E − · b · s.Eold; s.u = u; s.Eold = E; s.U old = s.u; j = (y − r)2·p.h ; n=size (s.jcost, 2); if n==0 s.jcost=j; else j=s.jcost (n)+j; s.jcost= [s.jcost j]; end s.signal = [s.signal s.u]; if (size (s.signal,2)==p.veclong) 72 I = calculatefft (s.signal, p.cutoff); if (s.I∼ =I) rtsys=distribCpu (I); end end s.signal = s.signal (p.calfre: p.veclong); set param (gcs, ‘UserData’, rtsys); case 2, analogOut (p.uChan, s.u); end B.2.3 Control algorithm for task function [exectime, s] = pid (flag, s, p) switch flag, case 1, r = analogIn (p.rChan); y = analogIn (p.yChan); rtsys = get param (gcs, ‘UserData’); p.h = rtsys.tasks{rtsys.running}.period; a = 2.71−10·p.h ; b = 2.71−4·p.h ; k = (8 · (1 − a))/(1 − b); E = (r − y); x = (k/32) · E − (k/32) · b · s.Eold + a · s.Xold; s.u = x; s.Eold = E; s.Xold = s.u; j=(y − r)2·p.h ; n=size (s.jcost, 2); if n==0 s.jcost=j; else j=s.jcost (n)+j; s.jcost= [s.jcost j]; end s.signal = [s.signal s.u]; if (size (s.signal,2)==p.veclong) I = calculatefft (s.signal, p.cutoff); if (s.I∼ =I) rtsys=distribCpu (I); end end s.signal = s.signal (p.calfre: p.veclong); set param (gcs, ’UserData’, rtsys); 73 case 2, analogOut (p.uChan, s.u); end B.2.4 Multi-task system on-line urgency computation function I = calculatefft (signal, BW) rtsys = get param (gcs, ‘UserData’); period = rtsys.tasks {rtsys.running}.period; signal=signal-mean (signal); signal= [signal (1)· ones (1, 200) signal signal (1)· ones (1, 200)]; N=size (signal, 2); fs = ; period Y =fft (signal, N); P yy = Y · conj(Y )/N ; f = fs · (0 : N/2)/N ; ; f1 = period N · fc ; i= fs Ai = P yy(i); I= AAmi B.2.5 Multi-task system CPU allocation function rtsys=distribCpu (I) rtsys = get param ( gcs, ‘UserData’); for i=1:3 ei =rtsys.tasks{i}.code.states.exectime; Ti =rtsys.tasks{i}.code.states.Tm ; αi =rtsys.tasks{i}.param.α; βi =rtsys.tasks{i}.param.β; −βi Rmi = αi βi e Tmi Ii end U=0; R=[R1 R2 R3 ]; ∆T = 0.001; while (U < 1) [Y,j]=sort (R); Tj(3) = Tj(3) − ∆T ; −βj(3) Rj(3) = αj(3) βj(3) e for i=1:3 ei U=U+ ; Ti Tj(3) Ij(3) ; 74 end Tj(3) = Tj(3) + ∆T ; end for i=1:3 rtsys.tasks{i}.period=Tj(i) ; rtsys.tasks{i}.deadline=Tj(i) ; end set param (gcs, ‘UserData’, rtsys); B.3 Kernel functions This Matlab simulation kernel was designed by Cervin (2000) The following functions are used for our dynamic scheduling simulation function [sys, x0, str, ts] = kernel (t, x, u, flag, init function) switch flag, case 0, [sys, x0, str, ts] = mdlInitializeSizes (init function); case 2, sys = mdlUpdate (t, x, u); case 3, sys = mdlOutputs (t, x, u); case 9, sys = mdlTerminate (t, x, u); otherwise error ([‘Unhandled flag = ’, num2str (flag)]); end function [sys, x0, str, ts, rtsys]=mdlInitializeSizes (init function) rtsys = eval (init function); rtsys.nbrOfTasks = length (rtsys.tasks); if ∼ isfield (rtsys, ‘mutexes’) rtsys.mutexes = { }; end rtsys.nbrOfMutexes = length (rtsys.mutexes); if ∼ isfield (rtsys, ‘events’) rtsys.events = { }; end rtsys.nbrOfEvents = length (rtsys.events); if∼ isfield (rtsys, ‘outputs’) rtsys.outputs = zeros (1, rtsys.nbrOfOutputs); end rtsys.timeQ = 1:rtsys.nbrOfTasks; rtsys.readyQ = [ ]; rtsys.running = 0; sizes = simsizes; 75 sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = rtsys.nbrOfOutputs+rtsys.nbrOfTasks+rtsys.nbrOfMutexes· rtsys.nbrOfTasks; sizes.NumInputs = rtsys.nbrOfInputs; sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1; set param (gcs, ‘UserData’, rtsys) sys = simsizes (sizes); x0 = zeros (1, sizes.NumDiscStates); str = [ ]; ts = [rtsys.tickSize 0]; function [sys]=mdlOutputs (t, x, u) rtsys = get param (gcs, ‘UserData’); rtsys.time = t; rtsys.inputs = u; i = rtsys.running; if i∼= rtsys.tasks{i}.code.execTime = rtsys.tasks{i}.code.execTime - rtsys.tickSize; if round (rtsys.tasks{i}.code.execTime/rtsys.tickSize) ≤ rtsys.tasks{i}.code.execTime = 0; set param (gcs, ‘UserData’, rtsys) feval (rtsys.tasks{i}.code.segs{rtsys.tasks{i}.code.currentSeg}, 2, rtsys.tasks{i}.code.states, rtsys.tasks{i}.code.params); rtsys = get param (gcs, ‘UserData’); if rtsys.tasks{i}.code.nextSeg == rtsys.tasks{i}.t = rtsys.tasks{i}.t + rtsys.tasks{i}.period; rtsys.tasks{i}.release = rtsys.tasks{i}.t; rtsys.tasks{i}.code.nextSeg = 1; rtsys.timeQ = [rtsys.timeQ i]; rtsys.readyQ = setdiff (rtsys.readyQ, i); end end end i = 1; while i ≤ length (rtsys.timeQ) if round ( (t-rtsys.tasks{rtsys.timeQ (i)}.release)/rtsys.tickSize) ≥ rtsys.readyQ = [rtsys.readyQ rtsys.timeQ (i)]; rtsys.timeQ = [rtsys.timeQ (1: i-1) rtsys.timeQ (i+1: end)]; else i = i+1; end end rtsys.running = 0; 76 while rtsys.running == &∼ isempty (rtsys.readyQ) i = rtsys.readyQ (1); for j = 2: length (rtsys.readyQ) if feval (rtsys.prioFun, rtsys.tasks{rtsys.readyQ (j)}) < feval (rtsys.prioFun, rtsys.tasks{i}) i = rtsys.readyQ (j); end end rtsys.running = i; if rtsys.tasks{i}.code.execTime == rtsys.tasks{i}.code.currentSeg = rtsys.tasks{i}.code.nextSeg; if rtsys.tasks{i}.code.currentSeg == rtsys.tasks{i}.code.nbrOfSegs rtsys.tasks{i}.code.nextSeg = 0; else rtsys.tasks{i}.code.nextSeg = rtsys.tasks{i}.code.currentSeg + 1; end set param (gcs, ‘UserData’, rtsys) [execTime states]=feval (rtsys.tasks{i}.code.segs{rtsys.tasks{i}.code.currentSeg}, 1, rtsys.tasks{i}.code.states, rtsys.tasks{i}.code.params); rtsys = get param (gcs, ‘UserData’); rtsys.tasks{i}.code.execTime = execTime; rtsys.tasks{i}.code.states = states; end end schedule = 1: rtsys.nbrOfTasks; for i=1: length (rtsys.readyQ) schedule (rtsys.readyQ (i)) = schedule (rtsys.readyQ (i)) + 0.2; end if rtsys.running ∼= schedule (rtsys.running) = schedule (rtsys.running) + 0.3; end mut = [ ]; for i=1: rtsys.nbrOfMutexes m = 1: rtsys.nbrOfTasks; for j=1: rtsys.nbrOfTasks if ismember (j, rtsys.mutexes{i}.waiting) m (j) = m (j) + 0.2; end if rtsys.mutexes{i}.heldBy == j m (j) = m (j) + 0.5; end end mut = [mut m]; end 77 set param (gcs, ‘UserData’, rtsys) sys = [rtsys.outputs schedule mut]; function [sys]=mdlUpdate (t, x, u) sys = [ ]; function sys=mdlTerminate (t, x, u) sys = [ ]; The functions following are used in the kernel function function value = analogIn (inputNbr) rtsys = get param (gcs, ‘UserData’); value = rtsys.inputs (inputNbr); function analogOut (outputNbr, value) rtsys = get param (gcs, ‘UserData’); rtsys.outputs (outputNbr) = value; set param (gcs, ‘UserData’, rtsys) function await (ev) rtsys = get param (gcs, ‘UserData’); if ischar (ev) for i=1: rtsys.nbrOfEvents+1 if strcmp (rtsys.events{i}.name, ev) break end error ([‘Event ’ ‘ ev ’ ‘ doesn’t exist’]) end else i = ev; end rtsys.events{i}.waiting = [rtsys.events{i}.waiting rtsys.running]; rtsys.readyQ = setdiff (rtsys.readyQ, rtsys.running); rtsys.tasks{rtsys.running}.code.nextSeg = rtsys.tasks{rtsys.running}.code.currentSeg; rtsys.running = 0; if ∼ isempty (rtsys.events{i}.mutex) set param (gcs, ‘UserData’, rtsys) unlock (rtsys.events{i}.mutex); rtsys = get param (gcs, ‘UserData’); end set param (gcs, ‘UserData’, rtsys) function cause (ev) rtsys = get param (gcs, ‘UserData’); 78 if ischar (ev) for i=1: rtsys.nbrOfEvents+1 if strcmp (rtsys.events{i}.name, ev) break end error ([‘Event ’ ‘ ev ’ ‘doesn’t exist’]) end else i = ev; end mut = rtsys.events{i}.mutex; if isempty (mut) rtsys.readyQ = [rtsys.readyQ rtsys.events{i}.waiting]; rtsys.events{i}.waiting = [ ]; else if ischar (mut) for j=1: rtsys.nbrOfMutexes+1 if strcmp (rtsys.mutexes{j}.name, mut) break end error ([‘Mutex’ ‘mut’ ‘doesn’t exist’]) end else j = mut; end rtsys.mutexes{j}.waiting=[rtsys.mutexes{j}.waiting rtsys.events{i}.waiting]; rtsys.events{i}.waiting = [ ]; end set param (gcs, ‘UserData’, rtsys) function o = code (segs, states, params) if ischar (segs) o.segs = {segs}; else o.segs = segs; end o.nbrOfSegs = length (o.segs); o.nextSeg = 1; o.execTime = 0; o.states = states; o.params = params; function n = currentSegment; 79 rtsys = get param (gcs, ‘UserData’); n = rtsys.tasks{rtsys.running}.code.currentSeg; function t = currentTime; rtsys = get param (gcs, ‘UserData’); t = rtsys.time; function delay (duration) rtsys = get param (gcs, ‘UserData’); rtsys.tasks{rtsys.running}.release = rtsys.time + duration; rtsys.timeQ = [rtsys.timeQ rtsys.running]; rtsys.readyQ = setdiff (rtsys.readyQ, rtsys.running); rtsys.running = 0; set param (gcs, ‘UserData’, rtsys) function delayUntil (t) rtsys = get param (gcs, ‘UserData’); rtsys.tasks{rtsys.running}.release = t; rtsys.timeQ = [rtsys.timeQ rtsys.running]; rtsys.readyQ = setdiff (rtsys.readyQ, rtsys.running); rtsys.running = 0; set param (gcs, ‘UserData’, rtsys) function o = event (name, mut) o.name = name; o.mutex = mut; o.waiting = [ ]; function p = getPeriod rtsys = get param (gcs, ‘UserData’); p = rtsys.tasks{rtsys.running}.period; function res = lock (mut) rtsys = get param (gcs, ‘UserData’); if ischar (mut) for i=1: rtsys.nbrOfMutexes+1 if strcmp (rtsys.mutexes{i}.name, mut) break end error ([‘Mutex’ ‘mut’ ‘doesn’t exist’]) end else 80 i = mut; end if rtsys.mutexes{i}.heldBy == rtsys.mutexes{i}.heldBy = rtsys.running; res = 1; else rtsys.mutexes{i}.waiting = [rtsys.mutexes{i}.waiting rtsys.running]; rtsys.readyQ = setdiff (rtsys.readyQ, rtsys.running); rtsys.tasks{i}.code.nextSeg = rtsys.tasks{i}.code.currentSeg; rtsys.running = 0; res = 0; end set param (gcs, ‘UserData’, rtsys) function o = mutex (name, data) o.name = name; if nargin == o.data = data; else o.data = [ ]; end o.heldBy = 0; o.waiting = [ ]; function prio = prioDM (task) prio = task.deadline; function prio = prioEDF (task) prio = task.release + task.deadline; function prio = prioFP (task) prio = task.priority; function prio = prioRM (task) prio = task.period; function data = readData (mut) rtsys = get param (gcs, ‘UserData’); if ischar (mut) for i=1: rtsys.nbrOfMutexes+1 if strcmp (rtsys.mutexes{i}.name, mut) break 81 end error ([‘Mutex’ ‘mut’ ‘doesn’t exist’]) end else i = mut; end data = rtsys.mutexes{i}.data; unction release (task) rtsys = get param (gcs, ‘UserData’); rtsys.tasks{task}.release = rtsys.time; rtsys.timeQ = setdiff (rtsys.timeQ, task); rtsys.readyQ = union (rtsys.readyQ, task); set param (gcs, ‘UserData’, rtsys) function setDeadline (value) rtsys = get param (gcs, ‘UserData’); rtsys.tasks{rtsys.running}.deadline = value; set param (gcs, ‘UserData’, rtsys) function setNextSegment (n) rtsys = get param (gcs, ‘UserData’); rtsys.tasks{rtsys.running}.code.nextSeg = n; set param (gcs, ‘UserData’, rtsys) function setPeriod (value) rtsys = get param (gcs, ‘UserData’); rtsys.tasks{rtsys.running}.period = value; set param (gcs, ‘UserData’, rtsys) function setPriority (value) rtsys = get param (gcs, ‘UserData’); rtsys.tasks{rtsys.running}.priority = value; set param (gcs, ‘UserData’, rtsys) function setRelease (time, task) rtsys = get param (gcs, ‘UserData’); if nargin == rtsys.tasks{rtsys.running}.release = time; else rtsys.tasks{task}.release = time; end 82 set param (gcs, ‘UserData’, rtsys) function setValue (value) rtsys = get param (gcs, ‘UserData’); rtsys.tasks{rtsys.running}.code.states.value = value; set param (gcs, ‘UserData’, rtsys) Create task structure function o = task (name, code, period, deadline, offset, priority) o.name = name; o.code = code; o.period = period; o.deadline = deadline; if nargin ≥ o.t = offset; o.release = offset; else o.t = 0; o.release = 0; end if nargin==6 o.priority = priority; end o.msgQueue = { }; function unlock (mut) rtsys = get param (gcs, ‘UserData’); if ischar (mut) for i=1: rtsys.nbrOfMutexes+1 if strcmp (rtsys.mutexes{i}.name, mut) break end error ([‘Mutex’ ‘mut’ ‘doesn’ t exist’]) end else i = mut; end rtsys.mutexes{i}.heldBy = 0; if ∼= isempty (rtsys.mutexes{i}.waiting) rtsys.readyQ = [rtsys.readyQ rtsys.mutexes{i}.waiting(1)]; rtsys.mutexes{i}.waiting = [rtsys.mutexes{i}.waiting (2: end)]; end set param (gcs, ‘UserData’, rtsys) 83 function writeData (mut, data) rtsys = get param (gcs, ‘UserData’); if ischar (mut) for i=1: rtsys.nbrOfMutexes+1 if strcmp (rtsys.mutexes{i}.name, mut) break end error ([‘Mutex’ ‘mut’ ‘doesn’t exist’]) end else i = mut; end rtsys.mutexes{i}.data = data; set param (gcs, ‘UserData’, rtsys); 84 ... Computer control systems constitute a large part of all real- time systems They have been widely applied in industry ranging from flight control to micro-surgery A computer control system consists of. .. 1.2 Motivation Traditional real- time computer-controlled systems are designed in two separate steps: controller design and real- time scheduling (Seto et al., 2001) Controller design is primarily... implement computer-based control systems: continuoustime design of the controller followed by discretization, and direct discrete -time design of the controller 2.1.1 Discrete -time design Discrete

Ngày đăng: 04/10/2015, 17:06

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan