嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 `! t: T1 b; \4 v" o8 y
: \; S5 A5 v9 e2 D: X! f' Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 O/ m/ p+ @* S* j' @#include <unistd.h>
( k( }1 _* n) `& J% C#include <sys/mman.h>
4 o( X/ c' `: j#include <sys/types.h>! I% w( M9 T- |6 D$ A
#include <fcntl.h>
  r+ ^& f% n8 f  i$ g- ^* n
+ a7 n1 G9 }8 V* y% b6 V/ C#define SHAER_RAM_BASE_ADDR    (0x80000000)   " u' D2 ?; R2 ~  O5 C& J3 O, I  w
+ {" p5 d" k/ s% J% O8 v
typedef struct
5 g, F. A5 W6 N% D+ p  L( O' U+ f, G{! O  [7 b9 J+ ^
        unsigned int a;+ e. P- S6 m  z9 E1 V: B8 K7 G
        unsigned int b;
, S8 F' j( ]4 S3 s        unsigned int packet_cout;
: m7 g3 f/ b% j8 M! L1 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% d- M! r5 x8 M' N

3 s) G) d+ d9 e7 ?) h9 {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! S6 L: h5 u6 ~+ H* f/ r
unsigned int count_copy = 0;2 S& `2 w! q0 O6 k( e* z
& K, Y$ I( d2 ^& f1 G

9 \$ [. h5 E9 h! ]int main()
+ G! K5 S# l- i2 B( X{
  d3 l& _3 \7 X6 X8 n9 i        pRX_MSG_PROTOCOL pshreRAM = NULL;* \* X% I( q7 v9 J, x7 P% p
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ D" p. w/ ^) U; b3 @  ?
/ k3 `& i# A- o8 b4 }. k        while(1)
: l' s5 @4 G& I        {
8 g! C$ }3 |* T; J: N; I, z                read_MSG_buffer(pshreRAM);
$ U7 J& v: ~- e, W/ h4 g        }                9 e' r/ m- [$ G( w
}) @& m! x5 o% F1 M) [8 U& p

2 ?3 ~& G1 Z3 o! O1 q2 kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 ~" L; l& q- Q5 f
{
: y) ?4 u2 Y- e9 S  [        RX_MSG_PROTOCOL buf;
7 |3 |7 f- C/ X& S; w, {        
- p+ B* j% N# K( l. F: p9 z! g) |+ L        buf.a = pshreRAM->a;, f% [* W* v" q0 Z& ?* i3 p& G. ~
        buf.b = pshreRAM->b;
. k) l' o" j4 x) G) {        buf.packet_cout = pshreRAM->packet_cout;' G$ l* G. z# z5 w. f& k. e' R
        
$ z- ]5 W9 N  n  c! `5 y        if(buf.packet_cout != count_copy)
+ |& ^0 e. p6 T2 |$ W6 U/ ~        {
4 J/ v, w% m& g                printf("a is %d\n", buf.a);
& w9 a0 o5 L) Z, e! M                printf("b is %d\n", buf.b);. K8 X7 k/ R- x5 B: s/ C: \' D' i
                printf("count is %d\n", buf.packet_cout);
/ Z& {: [+ @' Z* Q                count_copy = buf.packet_cout;
1 x. X% X; |: G- q" r1 u# d        }7 T; x, \+ A2 a' B- Z
        else0 J# n: ?; @7 X6 ~2 \+ C: ~
        {  C. B3 h& F) Q: E3 T. |. `
                printf("No effective message!");
4 k" l: Z0 w+ q6 ?* ]  }7 ~        }8 W; z$ p+ L) c* q/ I$ t7 C, f$ R( m
}: J" U8 E9 A% _/ q4 a

) c& R( N; }0 \; n* [
" f; ~! w* \  T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 V' a1 Z& ~& S& h
使用下面代码,对内存使用了mmap函数后:7 C3 T8 f9 w: w) Q
#include <stdio.h>
! g' F. r* C$ R#include <unistd.h>2 c# c/ ^; n! u- m4 H/ Q
#include <sys/mman.h>
3 c0 ^# s6 H4 F/ T#include <sys/types.h>5 T' ~. v- B! s/ c5 A
#include <fcntl.h>
- P& s" R8 N& O8 G5 {1 A: t$ a" e- P: K% y' ]. \, H
#define SHAER_RAM_BASE_ADDR    (0x80000000)! E1 \, D; j7 ]9 ]% n
#define SHAER_RAM_SIZE         (0x20000)   & k4 @; q9 c$ l7 l7 @4 ]

' A# ?* B5 |3 K+ p4 t- n0 C8 etypedef struct
% R# M$ }/ o+ I, ?! S  A3 F{
& Q$ h4 W. p0 M4 o- k9 _        unsigned int a;
2 O. X1 h. n2 s# s$ ?        unsigned int b;1 M- @& g2 M' n% S' r
        unsigned int packet_cout;
+ }" J6 \# N. r# n% g8 P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 {7 @0 x/ ^7 u9 t; t9 ]% p
: o. V/ M0 Z* h* ]8 ]- w
void read_MSG_buffer(int *baseaddr);
0 E4 y# }. S" A. k- `6 v  runsigned int count_copy = 0;
  a+ _8 l- m: E1 ^7 m% b' X1 ~2 Z8 h. y2 {. e1 R
int main()
! N4 X6 ?( q2 e& k3 O{
( e6 s1 k9 k( O' S        int fd;
' y# @* V9 z* p+ f- l        int *mem = NULL;
5 Q: [  V+ a% L& ?0 ]* d7 P- t7 O: r) a7 a) J* P
        if((fd = open("/dev/mem", O_RDWR)) <0)
' D! S  w# }  k# x        {
- ~- K# \& g7 d4 X" u! Y* L                perror("open error");4 R+ r' _1 e5 ?+ d$ I- |" S* `( a
                return -1;
+ J' ~# M1 s1 u7 {        }
) X* G4 w9 {% |( Z/ ^$ }  C; |        2 y9 }) r. H4 B4 i2 B" Y( g1 W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# ~; \! S0 p' N' C

: Q: Q) w/ A# _5 Z0 v- T) b4 r, P        while(1)
; q$ [' U5 \# N- `; l. k        {
$ N& ~6 {" m  T6 m  ~                read_MSG_buffer(mem);
9 A0 @9 D% E: U) x        }               
0 Q( B# m' G0 Z( [" S/ h- R}
, n! d* j9 y2 Q- O/ ^3 }5 @# e
' _% n9 s! F+ ?void read_MSG_buffer(int *baseaddr); \; ~  w! Z: b0 ~
{
; ?+ c9 m8 w4 i        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 L1 s1 g3 g0 e/ ]* P) X% I+ i& e& I1 N* t" P2 |/ b5 `) u
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, o1 c# \5 z# N/ J8 D# i
0 e/ p% l; F1 B) |1 Q        if(pshreRAM->packet_cout != count_copy)
, t  ^# K1 S! o# _        {
/ j' d9 ?  {' Z, ^                printf("a is %d\n", pshreRAM->a);, S5 D6 M5 v% ]8 s- @
                printf("b is %d\n", pshreRAM->b);" @4 r/ F1 P& l: _; q% J
                printf("count is %d\n", pshreRAM->packet_cout);
  M: R8 }4 g" F2 g/ z8 ], M% n                count_copy = pshreRAM->packet_cout;
$ ?% I. y, X: N' J4 U  O        }( F% t" z2 A4 t: Q
        else" L8 t0 f. j* N( O* m
        {% v9 w) O0 W7 ?6 a7 k
                printf("No effective message!\n");
; ~5 L' @6 K6 B  M1 p  d5 @        }- k. E) L$ E$ T3 D$ m
}
0 t9 a9 ^6 D5 _4 V
/ Z' b& ^( Z0 `% b3 e& d3 o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 Y( |3 @7 @) ^8 H4 `7 `, |, ^7 V, I9 f6 ^
2 u, c% `! |' _4 B

1 T% Q8 G) U$ ~0 m& f! m, W" H! f6 @0 i5 A! u1 S# p





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4