Q&A1

连接好BBB以后,先需要熟悉一下可能会用到的硬件外设,解决一些实用的调试问题。为了不一下子面对太多问题,暂时先使用片上自带的的gcc编译器而非交叉编译,先使用纯命令行和vim写程序而非IDE。虽然慢点,但很简单。

Qs:

  1. 怎样在片上编写、编译、执行、修改c语言程序?怎样debug?
  2. terminal命令和用c语言编写程序有什么相同和不同?能互相转化吗?
  3. 怎样操作IO口(both in and out)?
  4. 怎样使用AD?
  5. 怎样保存变量数据?
  6. 怎样向电脑传输数据?是否有必要用串口?怎么用?

等我解决了这几个问题再来更新博客。

================================================================

A1:Linux编程的基本操作。只列出命令名,具体功能请自行Google。
首先是Linux基本功如

  1. 随意跑到任意目录下(cd),查看目录下有什么(ls -l),显示目录(pwd)
  2. 新建(mkdir、vi、vim)、移动(cp、mv)、删除(rm -rf)文件和目录
  3. 根据(部分)文件名查找文件(find -name),根据文件内容查找文件(grep),在某个文件中查找某些内容并定位(grep -n)
  4. 查看文件内容(cat、more、less),编辑文件(vi、vim、echo)(echo的功能其实是向标准设备输出)
  5. 结束正在执行的任务(control+C)
  6. 自动补全文件名(tab键)
  7. 注意文件或目录名中出现任何符号时要在前面加上\转义字符

上面提到的vi或vim编辑器的使用

  1. i进入编辑模式,esc退出编辑模式,进入命令模式
  2. 命令模式下输入 :q 退出,输入 :wq 保存并退出,输入 :q! 强制退出

然后是关于编译执行调试c程序

  1. gcc test.c -o test 编译test.c并生成可执行文件test
  2. ./test 执行test文件(别忘了加./)
  3. 先执行gcc -g test.c -o testdebug 生成包含标准调试信息的文件testdebug,然后可以用gdb testdebug命令来调试程序

A2:(见A3的例子就明白了)

A3:怎样操作io口?(学习自这里 )
首先是直接用shell控制io口。

root@beaglebone:~# cd /sys/class/gpio
root@beaglebone:/sys/class/gpio# ls -l
total 0
--w------- 1 root root 4096 Jan  1 00:00 export
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip32 -> ../../devices/virtual/gpio/gpiochip32
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip64 -> ../../devices/virtual/gpio/gpiochip64
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip96 -> ../../devices/virtual/gpio/gpiochip96
--w------- 1 root root 4096 Jan  1 00:00 unexport
root@beaglebone:/sys/class/gpio# echo 44 > export
root@beaglebone:/sys/class/gpio# ls -l
total 0
--w------- 1 root root 4096 Jan  1 00:03 export
lrwxrwxrwx 1 root root    0 Jan  1 00:03 gpio44 -> ../../devices/virtual/gpio/gpio44
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip32 -> ../../devices/virtual/gpio/gpiochip32
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip64 -> ../../devices/virtual/gpio/gpiochip64
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip96 -> ../../devices/virtual/gpio/gpiochip96
--w------- 1 root root 4096 Jan  1 00:00 unexport
root@beaglebone:/sys/class/gpio# cd gpio44
root@beaglebone:/sys/class/gpio/gpio44# ls -l
total 0
-rw-r--r-- 1 root root 4096 Jan  1 00:03 active_low
-rw-r--r-- 1 root root 4096 Jan  1 00:03 direction
-rw-r--r-- 1 root root 4096 Jan  1 00:03 edge
drwxr-xr-x 2 root root    0 Jan  1 00:03 power
lrwxrwxrwx 1 root root    0 Jan  1 00:03 subsystem -> ../../../../class/gpio
-rw-r--r-- 1 root root 4096 Jan  1 00:03 uevent
-rw-r--r-- 1 root root 4096 Jan  1 00:03 value
root@beaglebone:/sys/class/gpio/gpio44# cat direction
in
root@beaglebone:/sys/class/gpio/gpio44# echo out > direction
root@beaglebone:/sys/class/gpio/gpio44# cat direction
out
root@beaglebone:/sys/class/gpio/gpio44# cat value
0
root@beaglebone:/sys/class/gpio/gpio44# echo 1 > value
root@beaglebone:/sys/class/gpio/gpio44# cat value
1


解释一下,首先要把某个(本例中是第44个)gpio export一下,变成用户可用的状态,然后目录里就会多出来一个gpio44文件夹,进入它对相应文件进行读写就可以操作io口了。输入输出是一样的道理。读的话Linux会自动实时更新value文件里的数据,但更新速度有多快暂时还不清楚,高速io操作的话用这种方法感觉不靠谱。不过速度不敏感的话是没问题的。

用c程序控制io口,我们当然可以完全照搬上面对文件操作的过程,只不过写成c语言的形式。具体如下

#include
#include
#include
#include  //define O_WRONLY and O_RDONLY

#define SYSFS_GPIO_DIR "/sys/class/gpio"
#define MAX_BUF 64

void main()
{
	int fd, len;
	char buf[MAX_BUF];
	char ch;
	int i;

	//export gpio44
	fd = open(SYSFS_GPIO_DIR "/export", O_WRONLY);
	len = snprintf(buf,sizeof(buf),"44");
	write(fd,buf,len);
	close(fd);

	//set direction
	snprintf(buf,sizeof(buf),SYSFS_GPIO_DIR"/gpio44/direction");
	fd = open(buf, O_WRONLY);
	write(fd, "in", 3);
	close(fd);

	//read and print value 10 times
	for(i=0;i<10;i++)
	{
		snprintf(buf,sizeof(buf),SYSFS_GPIO_DIR"/gpio44/value");
		fd = open(buf, O_RDONLY);
		read(fd,&ch,1);
		printf("%c\n",ch);
		close(fd);
		sleep(1);
	}
}


如上所述,用文件操作的话,速度受制于linux设定的文件更新速度。实际上也可以用直接读取寄存器的方法。详见这里

A4:暂且引用一下这里的方法。

root@beaglebone:~# echo cape-bone-iio > /sys/devices/bone_capemgr.8/slots
root@beaglebone:~# find /sys/ -name '*AIN*'
/sys/devices/ocp.2/helper.14/AIN0
/sys/devices/ocp.2/helper.14/AIN1
/sys/devices/ocp.2/helper.14/AIN2
/sys/devices/ocp.2/helper.14/AIN3
/sys/devices/ocp.2/helper.14/AIN4
/sys/devices/ocp.2/helper.14/AIN5
/sys/devices/ocp.2/helper.14/AIN6
/sys/devices/ocp.2/helper.14/AIN7
root@beaglebone:~# cat /sys/devices/ocp.2/helper.14/AIN1
1365
root@beaglebone:~# cat /sys/devices/ocp.2/helper.14/AIN1
1297
root@beaglebone:~# cat /sys/devices/ocp.2/helper.14/AIN1
1295


在这里我开启了8个AIN中的AIN1,并读取了3次数值,可以看到值在一定范围内波动。关于这么做的原理呢,涉及到一个很复杂但很重要的东西,叫做Device tree。这是新版的嵌入式linux用于统一管理硬件资源的方式。这部分内容比较多,我还没来得及消化,今后会用专文来写这部分。

A5:写入文件就可以啦,像前面的用c语言操作io口例程那样。

A6:基于ssh连接的话,用scp [OPTIONS] file_source file_target命令就可以了。例如:
从电脑复制到BBB:

# scp /Users/myname/full.tar.gz root@192.168.7.2:/home/root

然后会提示你输入另外那台192.168.7.2主机的root用户的登录密码,接着就开始copy了,复制目录加参数-r即可
从BBB复制到电脑:

# scp root@192.168.7.2:/home/root/full.tar.gz /Users/myname/full.tar.gz

暂时用这种方法足够调试程序了,串口只有在实时查看数据时才有必要用,等需要用时再说。
会互传文件以后,编写程序就更方便了,我甚至可以在Mac上装上gcc编译器(这是很容易的事),某些与硬件无关的程序可以在电脑上书写并编译通过以后再拷贝到BBB中去,修改内容和编译速度都会快很多。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s