嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! V$ S9 S) D$ N% N h% [( ~
* k6 o5 Y* P. n+ ^$ _* G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 l$ u3 u# z" Y/ ]
#include <unistd.h>
' j; [& H4 s5 f" m1 a1 ?
#include <sys/mman.h>
- s+ L5 u8 v; {6 t3 s5 M
#include <sys/types.h>
' S5 W. O2 l! }/ K: ]0 J/ `3 G# t' A
#include <fcntl.h>
9 \9 ~8 v: g# [3 a3 H
' a: P3 U( ^, U, `6 E* |
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 F; V/ v: b$ l/ ]+ J
0 P) u; N' u( i: ]' S/ y/ Q- q# `1 c5 g
typedef struct
- c# s3 a% w& U; l5 d& s& `
{
: J7 O' o w& t: w% V
unsigned int a;
( d) {" j8 \& d& b5 C% a1 S. s
unsigned int b;
7 |9 w+ r9 f2 i3 q _
unsigned int packet_cout;
2 g+ T' Z; [7 W% x: j" j N" i& D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 u$ {* D9 i1 b6 z3 Q5 o( b$ w
2 {. n$ W7 N- C" ?) h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 h+ }, l. S' }# o" G
unsigned int count_copy = 0;
2 ^; E- [5 E) L M$ ~5 r
7 M; B/ O! p5 A( w! M8 } z; G
4 n' T$ t4 `$ p* `! ^0 W6 a
int main()
% B5 s$ W2 F1 P. Q l! q* l
{
( l7 x; [( ~: o
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 ]0 n$ p7 |( l6 f$ F: ]7 E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) r( |2 z" U; B9 A7 L; j! ~0 }
7 x: w8 }: M, d
while(1)
. Y& s* r+ I/ o
{
2 @6 ?( {4 Z( z3 q# O0 [
read_MSG_buffer(pshreRAM);
M* x1 z s8 f/ y$ }
}
9 i* v( d+ v- J2 F* q( K
}
4 d: {. M) _* N* _) m1 b
2 r, G' q+ q3 G- x) X4 y+ g9 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 ?5 E: f7 x7 X7 {/ L: v
{
4 x2 t5 O$ k) L0 L
RX_MSG_PROTOCOL buf;
7 L* U- u( x% H2 Z- z6 _: @1 I
% i! O! G* @ }6 m3 U) ]8 E
buf.a = pshreRAM->a;
* s% s9 H$ w0 Q. }/ e1 o1 D
buf.b = pshreRAM->b;
( U9 N" b% S( T+ ~1 n. }: S
buf.packet_cout = pshreRAM->packet_cout;
) U& _" b) O3 t9 g5 g- |7 ?
3 l ~" b, Q* V! O m# j% r
if(buf.packet_cout != count_copy)
5 v `/ X% n& R- Z6 R
{
4 E) ~3 }5 C: J- u) R }
printf("a is %d\n", buf.a);
) L. s: D! R- N6 \! t
printf("b is %d\n", buf.b);
- W/ r) u0 ?5 ?6 I0 e+ f8 `
printf("count is %d\n", buf.packet_cout);
. h! S% m O( ?1 h Q3 p% D
count_copy = buf.packet_cout;
, v. k! }$ Q: d: J! I2 m
}
: c( G9 j8 i+ H0 Y
else
# ?/ A% d4 S6 ]6 e
{
, }; Q+ b6 Y. s* W
printf("No effective message!");
' | _! {9 I/ r z' Y# ?
}
2 z2 l/ d2 d* x% W* W
}
' ~4 W4 O( m _4 J
_! {, c% p2 Y+ l; j) B
. I% r, @1 C1 ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* P& t8 i! M7 A v# D
使用下面代码,对内存使用了mmap函数后:
6 }; g! E8 a* x0 Y7 {8 p* J# c
#include <stdio.h>
$ P+ d2 Q- d* x" }
#include <unistd.h>
* J( f1 v% {3 n0 r" P
#include <sys/mman.h>
' P, B# f3 i7 [
#include <sys/types.h>
4 L: [+ m' u8 v
#include <fcntl.h>
6 K7 P1 w6 K) s" R6 i) Q% f
3 d' {) h8 ]# R4 m
#define SHAER_RAM_BASE_ADDR (0x80000000)
) B, K3 M0 Q' w) }# [
#define SHAER_RAM_SIZE (0x20000)
+ |) d& K( L9 j" s; R1 O" Q
0 i8 ~5 x. n' T7 Q" c0 |- {
typedef struct
# U8 R' K- Z9 i- \$ J+ o! e2 x
{
; z: ]+ p' m' U% s6 U- y
unsigned int a;
% c5 t/ ]' J' J, d! w/ ^8 P$ Z
unsigned int b;
+ s6 S( g: F( m2 P+ n# d) O/ _$ _2 Z F
unsigned int packet_cout;
; a0 k k$ l2 {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 i9 A4 p, |. ]8 E" J" ?$ U
7 y: r" q* d4 d7 Y5 j
void read_MSG_buffer(int *baseaddr);
+ p5 y& G1 j$ {4 y( O
unsigned int count_copy = 0;
8 ]1 N T0 y' X, f
+ T! ]& L7 w4 [" E9 A5 p) L+ s' u* F
int main()
2 p! S- i7 g3 J2 S G
{
2 B2 x5 T5 G |5 t! }. x
int fd;
0 E4 m5 N5 s: X# K1 @. M- R
int *mem = NULL;
& v6 A: g( ~/ D
: F' R) s4 w6 W9 B2 K, \
if((fd = open("/dev/mem", O_RDWR)) <0)
$ f! A, a+ U8 C" ]. W
{
$ Q% m. U }) s( F' ?5 Y0 O8 H
perror("open error");
6 ^/ r7 V7 v7 b+ c Z5 Z" t
return -1;
7 K0 ^2 U+ m+ p3 O# c& X
}
?' o9 @$ a- ]1 i o
8 s3 l, W8 E- A9 G5 L$ H) {
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 h6 z, E( \1 C& m! N
; _2 w @, A1 a: N1 m% n v
while(1)
$ s( Q8 s. B' t
{
8 M5 _+ c& C9 ] `
read_MSG_buffer(mem);
; j; F& W9 ` Y5 F
}
9 j' d8 w7 |9 J' ^9 \
}
4 G, ^2 I- b3 E) D, z& E
3 p; z& p5 A3 i" D( F" R8 r
void read_MSG_buffer(int *baseaddr)
2 a* R, A2 \. X
{
1 L& M( l; U* C7 H3 ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
* C4 K5 S/ J/ T9 z% y
7 S$ b7 `2 }! t3 p9 l: p
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% [$ @% Y5 w- W' ~4 `9 ]& \7 H: w9 t
! p, B' l# d/ U4 Z
if(pshreRAM->packet_cout != count_copy)
; y. V4 e( H: F
{
3 E8 i% H, p9 Q% ^5 K4 n2 Q; m
printf("a is %d\n", pshreRAM->a);
& k3 N; `. k m
printf("b is %d\n", pshreRAM->b);
. t) G8 n. i" T7 R: U& ~7 E( g9 {
printf("count is %d\n", pshreRAM->packet_cout);
9 t# n# ]2 D9 L4 x6 b
count_copy = pshreRAM->packet_cout;
+ {0 B5 d9 I5 L
}
, @7 Y' T B3 r: b3 n7 P
else
8 h0 w7 r& q* _$ \8 F6 r
{
+ N D+ \( }# Y
printf("No effective message!\n");
% f9 p% [7 ~5 b, r- _/ o2 n
}
# a9 ?3 K5 x0 H$ x
}
' |6 i1 ^ _" {/ U, z% k& t
/ i' n7 t" y% t! n# g
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% ?9 {% {' M# h) H" n2 l
! G2 [4 Y7 }) I$ s" d2 ^9 Y0 x
' ]$ [8 Q( l! ]: S
' L% ^2 E. T, l7 N @" O
) u; r, j2 f, D2 e$ U$ J; M
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4