嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; U, y/ [8 q& j0 v! m5 ~
& Y4 f" f$ N% J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& n& t/ T3 _! R
#include <unistd.h>
1 e: D( E# W! Z% O% u. h0 |
#include <sys/mman.h>
6 o; `. A5 M8 S6 D
#include <sys/types.h>
8 Q8 I& T0 B9 @8 \4 v2 C
#include <fcntl.h>
) T; e1 g. m: H# w8 k# T
6 T L- b' h9 V) L4 S
#define SHAER_RAM_BASE_ADDR (0x80000000)
, ^4 B8 j ~, Q5 x: @) P
$ w8 [! h7 |0 |$ Z" v0 U3 d/ A
typedef struct
0 ?5 K; Z: L. H1 e. K4 \0 o+ M
{
" J4 y- `) [# L5 Q5 p5 m0 J
unsigned int a;
, Z5 J+ J3 o) r _
unsigned int b;
" P% {$ x( N6 r- u V0 a
unsigned int packet_cout;
7 z* G" Z+ f& V9 u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ~% G/ p) d" Y' D
" O/ [- ?: X/ H2 D6 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) A( `) ], t6 {
unsigned int count_copy = 0;
" T* M1 ]: B) F! R
( l1 j, @( ?4 W+ w6 E) p
' L/ D' K1 _6 R
int main()
v U7 [" |% m$ m
{
5 O! r8 o6 N B% m
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ [: [/ X6 L6 p0 _4 n- K
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. X6 f8 V& T2 t; c6 i/ y! j7 A
3 {7 F) _' M6 f
while(1)
5 r9 u6 v- T+ W% G
{
: N# G- t! H& D/ k
read_MSG_buffer(pshreRAM);
~1 E5 O, D9 F* v- t3 [, K, E# D
}
( ?& Z4 M/ T) U( [& d* ?/ r" y
}
: T6 g8 x9 Z4 z$ H' V5 R5 y: h5 [
0 Q4 k* n0 u0 n: D% b1 N9 N3 _( \$ Y7 N4 E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ M0 m8 x; m1 P
{
/ V# _" |2 E2 E: _7 a" |1 ^6 Q7 d
RX_MSG_PROTOCOL buf;
" j0 Q$ ^: `$ U$ x
3 _2 W( V/ G; C$ e b0 l
buf.a = pshreRAM->a;
. \. g1 H, Q- Z- \( \2 b- J6 Y; N
buf.b = pshreRAM->b;
i* `; Y0 p* ^+ i' q+ ]* j
buf.packet_cout = pshreRAM->packet_cout;
% ]4 `7 o3 m4 M* w9 f
1 |; N7 y: U. x8 G7 p
if(buf.packet_cout != count_copy)
4 Y G O' k* d. L+ A
{
2 @" `5 A9 E" [! D% N1 [
printf("a is %d\n", buf.a);
, y6 w; R4 q- O1 G
printf("b is %d\n", buf.b);
9 p D* r1 c8 d( ]
printf("count is %d\n", buf.packet_cout);
# p# I7 p" z m/ M
count_copy = buf.packet_cout;
+ o, h# T, W) P$ [3 Q5 \/ f9 H
}
" T$ Q$ K/ ~/ R) p `" C
else
5 @* b7 {0 Z2 b3 m) J% s+ r; y
{
% \; }# Q) y5 f) w
printf("No effective message!");
( d, A& X1 d0 a" T( M
}
2 r0 \, S9 P) T3 ~. G$ N/ V
}
; @7 O1 E; j% y; o
1 y9 ^; d' Y$ D) B
7 L2 v, }4 @0 P+ N$ ?) Y) U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, [ g0 C2 F4 f/ B% F1 ~
使用下面代码,对内存使用了mmap函数后:
( H$ `" y1 e, b6 X8 [
#include <stdio.h>
8 {- j' _( X; N7 x" ~) ]
#include <unistd.h>
7 }1 W7 g2 Z1 O* _7 q
#include <sys/mman.h>
0 @& S4 F, E/ o6 e1 T- O
#include <sys/types.h>
5 l6 L2 `: }0 E, B6 y
#include <fcntl.h>
4 e% y4 F- A6 u$ D4 Z
) Z* x; T$ m1 W; C( t6 w
#define SHAER_RAM_BASE_ADDR (0x80000000)
& l" O9 \2 t, I
#define SHAER_RAM_SIZE (0x20000)
; P+ `" h# Z+ c, h" ^9 L
4 E g( t9 H3 c/ T) {) E
typedef struct
! [2 N, ]! t8 H! V6 Q7 E
{
$ w9 ?' h6 {: R" l" W; P
unsigned int a;
$ x* Q. u- u+ K. w; e+ L9 J5 P
unsigned int b;
/ Q! i+ W& q4 R, D; S* [
unsigned int packet_cout;
/ t" Y4 `( \+ p7 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ d2 ^* k) R9 z* U1 l2 p, }
. S" t8 _- u; e( W. x
void read_MSG_buffer(int *baseaddr);
`& |) q, Q: q1 D# _ p4 u' u
unsigned int count_copy = 0;
) X4 n: ^9 F8 D6 o
! R5 W6 Y, S( I6 ~( ]3 `, V R) W6 j; U
int main()
& M" \: F1 j: l! @
{
) g/ @. X0 ]3 X6 a7 Y
int fd;
$ ~$ }0 y# k3 P7 F* C! w
int *mem = NULL;
( w" [. K) Z. r! n) D' N
. A% O! |7 ]" e, k& Z
if((fd = open("/dev/mem", O_RDWR)) <0)
# j6 U6 M& c2 g8 _! H
{
( u, t# {$ j K% r
perror("open error");
- |3 u% u+ V9 T2 \" G, z
return -1;
. k! G- F) F) A! O. y* B
}
7 {. K+ Z' Q: }6 G& Q& G% t
* e5 ~0 b& ^ r( C) ]) N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" R7 |% ]3 U5 w ^' O1 c) G; s
) ~: E& p% c, Q* Q8 q
while(1)
1 ?5 _ c3 n; C" k6 p" |9 _
{
9 g" X+ S) O* h2 D
read_MSG_buffer(mem);
t$ ^7 i% I, J: R, O
}
' x3 v$ e! m1 b& p( O6 g$ x5 B
}
6 E! c; b% f: K8 P4 }+ a: W$ M
8 q4 b" D/ d& c" Y& v! M
void read_MSG_buffer(int *baseaddr)
; {% K7 I9 o0 [. F# j- p
{
( |# u( N( ~/ p7 Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
* Y0 G p( t+ e! L! z
$ X% e6 `8 |8 w/ w8 L7 k! p
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 y, j9 x0 |* t) f
" ?0 |/ r B- n* y( h
if(pshreRAM->packet_cout != count_copy)
! H# Q5 ^1 ^+ Z, a) R# u. J1 f- s
{
* l: q) ?% I( k4 ~$ J; R! m2 O
printf("a is %d\n", pshreRAM->a);
! F4 `; [# V# a6 {. G
printf("b is %d\n", pshreRAM->b);
* [: L5 |( D4 f! D( K! Z
printf("count is %d\n", pshreRAM->packet_cout);
, R% E" q/ x9 X h7 W# r+ Q
count_copy = pshreRAM->packet_cout;
+ [# h: o2 C# S$ N" m6 k' I0 B
}
3 n8 g* i: B' R7 G9 ?1 `
else
( ^& c; h4 }) @ I+ {& p3 b
{
! A% x# @7 V, R4 _- f, m$ K) l8 K" A
printf("No effective message!\n");
* N3 y1 f! @ L' j$ Y# u
}
; P+ S4 U* f; A
}
' F* R1 r/ |( Z! ]
, G1 y5 @3 z2 |2 r; W8 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& O4 B T: E; i6 H9 O$ P1 H
G% z0 Y0 k, S' K/ K
: k w5 R5 V8 }8 B* ~ {
) X: h6 ~) o, p% q
" P" ?0 s. [; D3 `# L/ }
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4