嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, R7 b2 w0 o1 A+ s$ T, @' Q
0 k' R/ z! n2 N( |, U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% ]: X( Z1 f: d, {# x1 @6 p
#include <unistd.h>
: ^8 ^9 X3 F( \8 r$ a
#include <sys/mman.h>
& x/ R9 F: N% j/ |6 Z" u# s
#include <sys/types.h>
8 C1 c0 r8 R% W: x0 a
#include <fcntl.h>
z! C. m ]; k, w! W) E& m
9 ]7 E+ B$ q- O$ I n$ A* u6 ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ p& E" N" h# Y1 d* l
. Y, ^& a$ e5 y+ h( h1 d l* z3 k
typedef struct
$ z! i, V0 r! \0 V, `9 v3 e7 {
{
5 x9 n L/ P* X! S( Z! E5 u
unsigned int a;
4 `* j2 U" h% z' f* I; {' c
unsigned int b;
2 D# D5 E$ r: S' _
unsigned int packet_cout;
% p- W8 }# g) N7 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; H [) T8 N3 O+ x: A
' O1 l. m- C5 H$ }/ I7 `: I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 M; r( Z M% m3 j7 K. y
unsigned int count_copy = 0;
% u! [* O0 A+ j/ L \
! s0 R L$ k- ]* N
& c* u" Q$ {6 l# G
int main()
( |5 |% C* A7 B6 F4 w& E0 \
{
0 @ A, M" L+ z% i% x: U) F& R
pRX_MSG_PROTOCOL pshreRAM = NULL;
% m4 p: b" Z2 w2 `) P/ Y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ M2 r% w, q( W" t3 n a" z
7 m$ V8 l a3 T5 ]% p
while(1)
9 U6 i- J: J% `1 ]3 ]* H! X
{
5 Z' O: N# f- e5 R5 @: K# X/ X
read_MSG_buffer(pshreRAM);
% W7 q& e! l" C' n$ O5 q
}
& ^4 Z0 t- p( w8 E- Q
}
8 l+ F2 w; b T( @/ D3 b) w
5 u: ]9 i+ K; T' ~$ L0 ]# ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 Z" {8 P4 ~4 L1 @7 r
{
4 Q' R0 `9 Q g. q7 [& V; _
RX_MSG_PROTOCOL buf;
6 k* T! b1 s1 p. } Z% Z2 S( U( m
( q% s4 t. P. \5 k( B' r
buf.a = pshreRAM->a;
+ I. r4 H" }; o7 O$ A
buf.b = pshreRAM->b;
1 r2 f3 R4 x1 ~" ^
buf.packet_cout = pshreRAM->packet_cout;
: M1 n$ r& C+ C: V- U
, ]" n# d4 ]+ ~6 J k- }
if(buf.packet_cout != count_copy)
+ D0 U; |0 z4 R; j. F5 N
{
; M( U( M+ d0 G: C4 J) k
printf("a is %d\n", buf.a);
& l* w' {3 v. w
printf("b is %d\n", buf.b);
0 k: y( R% d2 h- i! [6 Q0 k+ u7 v
printf("count is %d\n", buf.packet_cout);
& E( D" q$ r& A! Z+ D& n9 V
count_copy = buf.packet_cout;
; W! ~5 _% M: X0 K& K/ X
}
6 h# l$ g, ?/ y) y
else
" D; K% u; S5 z
{
5 l; j+ f7 {5 N) o- {5 L; q! d' A& r
printf("No effective message!");
, v1 M% w$ J$ Y2 \
}
H( x/ b# L6 T* w
}
# V' @# i$ _5 e7 y) o0 Z% \
6 H& J' |3 V# s' O" `) F
& M5 w7 d$ H; [6 M i4 n( Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! p3 d# U1 M4 g
使用下面代码,对内存使用了mmap函数后:
# |% |9 e8 R7 B4 ~! J% i" b( t* G
#include <stdio.h>
5 Z; V0 a6 K( T: p! o
#include <unistd.h>
3 S% T8 [* @7 j7 j; S
#include <sys/mman.h>
, ]' }/ \+ i, ~/ p, f& l( }' v! A
#include <sys/types.h>
3 U P* k( T2 l' T' u/ V
#include <fcntl.h>
4 l( A2 O0 r8 T
) l8 U5 h. E4 s0 A
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ E/ a9 X; M6 n# q: x6 H, O- t
#define SHAER_RAM_SIZE (0x20000)
/ ~. r7 U2 O! ?4 v2 ]
! ^: |) Y+ L2 \: f7 G. G9 D4 E3 o1 i+ E
typedef struct
: O5 U; {" {: i& O, q! H& l# W
{
: k8 x. A# ]0 p" t0 b
unsigned int a;
, e0 S% s6 N+ A! h
unsigned int b;
* u' `' d" z; \0 f! i
unsigned int packet_cout;
E+ c. M5 x! D; {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& h% [1 z* {$ O) }6 n/ t/ J
- G; u0 A1 R {
void read_MSG_buffer(int *baseaddr);
G8 Y+ f4 X- c
unsigned int count_copy = 0;
4 ^7 p# p c& m% _. w6 C
4 X0 Z" R0 n9 J# F# b* r
int main()
- @+ t/ K1 f" x+ C& C2 q
{
1 `: U/ {. S/ `& U0 R
int fd;
5 l4 P, d% d2 I3 x* l
int *mem = NULL;
9 H2 c/ b9 b0 K9 E) ]/ B; j7 n
% B! X8 c) k+ Y/ ~% N
if((fd = open("/dev/mem", O_RDWR)) <0)
$ S! q+ G5 ~# N: @5 @6 T
{
3 G. j1 J, |4 | T" C
perror("open error");
2 { B1 `% U5 x/ x* \
return -1;
" T/ d! E* {- y2 [3 A
}
% r3 v- C9 V2 [6 X/ V
( U/ R2 [- n3 ~2 n% b
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. }/ l; ]( W& z
' O$ T X. [7 N! f. z
while(1)
1 x. l- P* T' T
{
5 i, d* Y" J2 A
read_MSG_buffer(mem);
8 b3 U+ t# g% `% }
}
1 _9 T/ g" w% C+ J3 p4 {6 _) F
}
" N5 I2 o+ [" \$ j
) J, H% {9 H' \# Q" Y* D
void read_MSG_buffer(int *baseaddr)
$ W+ u, o* M$ U1 T4 f& y- D* b4 C
{
2 V1 {2 D% Z2 U9 v
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 D* u6 Z& |2 L
7 M* D* d( X! O: x5 ~
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# e0 ]* u1 j: F
. X' j, L2 x. [/ b
if(pshreRAM->packet_cout != count_copy)
7 m0 `# q7 i; U
{
) R/ u- q; L# m8 K/ c3 q
printf("a is %d\n", pshreRAM->a);
2 M" @8 T6 a( m* m+ N
printf("b is %d\n", pshreRAM->b);
4 ~; w3 C1 d. |/ M7 N0 G9 b
printf("count is %d\n", pshreRAM->packet_cout);
h. z- y3 ?# W8 O& `& t. m4 y
count_copy = pshreRAM->packet_cout;
m: o" o. X9 ?% D6 R
}
2 ^9 A& D0 ^7 ~: R# q
else
. @1 U0 q- o) |* p
{
( @/ b' L3 z* t/ Q8 I
printf("No effective message!\n");
& B: f2 ]; b T7 h% ]9 @8 n
}
9 k% g4 v: O8 f9 a* {
}
% g7 l( p K6 L4 k* ~
/ c" ?' E+ W8 C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ k2 e B: E! n1 ~# w7 S
0 U$ p( o9 m. U: O8 G+ ?5 j% Z
7 b/ ^$ z q1 b: G% `
- k6 J* v1 Y4 c2 H
9 ]5 M' H" Z6 F/ H* T2 |1 Y% q& p
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4