为什么80%的码农都做不了架构师?>>>
目标:
移植uC/OS II到RPi上,实现两个任务的调度。这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行
具体步骤:
助教给的代码已经很完整了,只要对目录里的usrApp.c代码改一改就行了。
一、修改usrApp.c:
原来的代码中已经有usrApp1和usrApp2两个函数输出运行显示,只要在里面加上控制led亮灭的语句就行了。参考Lab5中的blinker.c代码。具体代码如下:
#include "uart.h" #include "ucos/includes.h" extern void PUT32 ( unsigned int, unsigned int ); #define GPSET0 0x2020001C #define GPCLR0 0x20200028
void userApp2(void * args) { while(1) { uart_string("LED OFF"); PUT32(GPSET0,1<<16); OSTimeDly(1000); } }
void userApp1(void * args) {
while(1) { uart_string("LED ON"); PUT32(GPCLR0,1<<16); OSTimeDly(500); } } |
因为extern void PUT32 ( unsigned int, unsigned int );所以需要把lab5中的start.s汇编文件考到当前目录。
二 、make:
安装yagarto
到官网http://www.yagarto.de/#download下载YAGARTO GNU ARM toolchain (37 MB)和YAGARTO Tools(2 MB)
安装后就可以make了。
修改makefile
编译前需要重新配置makefile中的 INCLUDEPATH ?= "C:/workspace/ucos_raspberryPi/h" 为实际工程的"h"文件夹所在的位置
还有makefile最后一行多了一个点
ARMGNU ?= arm-none-eabi
INCLUDEPATH ?= "E:\2012-2013年春夏学期\嵌入式\ucos_raspberryPi\h"
COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mcpu=arm1176jzf-s -I $(INCLUDEPATH)
gcc : kernel.img
OBJS = build/startup.o
OBJS += build/uart.o OBJS += build/timer.o OBJS += build/interrupts.o
OBJS += build/OS_Cpu_a.o OBJS += build/OS_Cpu_c.o
OBJS += build/ucos_ii.o
OBJS += build/main.o OBJS += build/userApp.o
OBJS += lib/libc.a OBJS += lib/libgcc.a
clean : rm -f build/*.o rm -f *.bin rm -f *.hex rm -f *.elf rm -f *.list rm -f *.img rm -f build/*.bc
build/%.o : port/%.s $(ARMGNU)-gcc $(COPS) -D__ASSEMBLY__ -c -o $@ $<
build/%.o : init/%.s $(ARMGNU)-gcc $(COPS) -D__ASSEMBLY__ -c -o $@ $<
build/%.o : port/%.c $(ARMGNU)-gcc $(COPS) -c -o $@ $<
build/%.o : bsp/%.c $(ARMGNU)-gcc $(COPS) -c -o $@ $<
build/%.o : usrApp/%.c $(ARMGNU)-gcc $(COPS) -c -o $@ $<
build/ucos_ii.o : ucos/ucos_ii.c $(ARMGNU)-gcc $(COPS) ucos/ucos_ii.c -c -o build/ucos_ii.o
kernel.img : raspberrypi.ld $(OBJS) $(ARMGNU)-ld $(OBJS) -T raspberrypi.ld -o ucos_bcm2835.elf $(ARMGNU)-objdump -D ucos_bcm2835.elf > ucos_bcm2835.list $(ARMGNU)-objcopy ucos_bcm2835.elf -O ihex ucos_bcm2835.hex $(ARMGNU)-objcopy ucos_bcm2835.elf -O binary ucos_bcm2835.bin $(ARMGNU)-objcopy ucos_bcm2835.elf -O binary kernel.img |
之后启动cmd 到ucos的所在目录make
在ucos的当前文件夹里会生成50k的kernel.img
三、启动
把生成的kernel.img改名为ucos.img,把他拷贝到树莓派sd卡的boot目录下.
修改启动配置文件config.txt 加上一句”kernel=ucos.img”(有的话改一下)。
启动树莓派。发现树莓派的ACTled灯会间断的亮灭。
开启putty连接树莓派串口得到两个线程的输出:
浙江大学嵌入式课程非荣誉出品