OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5271|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. _* ~- Z& \3 I- R! s' e) Y2 ?% L* a, r+ Q. Y. _! O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* E, h. S/ I. C: _, @- W2 b9 o#include <unistd.h>; O: e+ l6 l4 `! T* h" c9 Z" y
#include <sys/mman.h>1 S* [  d6 p1 L* u
#include <sys/types.h>
( {/ l5 ^% k' k" o5 I% R#include <fcntl.h>
& _; a9 x8 ^+ z8 T: N, D+ Q( v, Z7 _, `4 h, K+ i' E( m. }' W! u7 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  y- U; b) ]* e: X6 t* u$ J* i- L3 w, K: p) _  B+ B: ~$ h
typedef struct6 p* H: s; @5 ^, X" M1 W
{
- W, p$ N$ p2 d% K; S. K6 X1 h8 R' w        unsigned int a;
8 M/ H) E1 d% y- V+ V4 o: E        unsigned int b;
: H" c' E" M0 m- Z" e- T8 k        unsigned int packet_cout;
  ^+ h5 L+ E/ i& L3 q; P) g7 P7 }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: G- Y5 }2 L4 u$ F4 [1 q  ]7 h  G/ ~! i8 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 U1 L2 e' [2 N+ @% ]( `/ ?unsigned int count_copy = 0;0 o, D5 R3 m/ w' `: s1 Y8 F7 W, U- ^. O* y

# {* t+ ]5 v" d  ~. E+ f! W
0 |) |! `6 l! H) j" \2 zint main()6 T& P$ Z# s+ Q' \% @
{
* x2 o2 V& @* E' j; U* e        pRX_MSG_PROTOCOL pshreRAM = NULL;
* \9 b6 o8 D3 |8 \/ K! C4 Q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& V% \" h( N6 E7 Y1 E# T, e

* X, |; k/ l  `; W3 z& F7 S        while(1)
7 Y/ R& x. L  L" w) D0 b; t        {
8 N5 G3 E% Y! t% F                read_MSG_buffer(pshreRAM);
) b3 b8 W0 J; a* e0 }0 @2 e/ U2 g# k# b        }                % y8 k/ p6 V& O/ i  E  Z5 ^# _8 W' H3 B
}6 }- m0 E1 n9 G0 C) v
; `1 ]# K' J# z8 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 g4 r* _/ O& d* R) G{* j3 o  A9 w( L8 d, f
        RX_MSG_PROTOCOL buf;# B% d" I- E7 C3 g; z
        3 z1 M( I. F1 t3 t0 c& Q- {0 Y8 _
        buf.a = pshreRAM->a;
" C) n, s0 s& y1 t" q        buf.b = pshreRAM->b;  p8 }7 o* w1 V
        buf.packet_cout = pshreRAM->packet_cout;$ m) a: @+ C2 p2 }& k& Z
        0 w0 {+ f3 a# |9 i
        if(buf.packet_cout != count_copy)( Z  d" l1 Y# P
        {5 o( M* H' v! E7 B& w
                printf("a is %d\n", buf.a);7 S, Q3 U6 t9 I$ U* y
                printf("b is %d\n", buf.b);7 t  h, ?) _8 C$ m0 X1 p4 l
                printf("count is %d\n", buf.packet_cout);+ c" _2 y5 Q6 e4 V
                count_copy = buf.packet_cout;
8 f7 N$ Z7 y, p' D9 Y. a# P: B        }
4 Y- n/ Q( K" M; {: r1 \9 r        else+ `1 R6 j2 n, s9 \/ }* v. s
        {2 k4 f8 R6 x  @, B
                printf("No effective message!");! {! y- m: \: o% q: e- e) l: r
        }6 b" D; H$ `# _' G- `* T3 g# O
}- ~6 u  s# o. n3 S0 z4 q# `2 o# w& U
9 [5 Q( U7 j7 O# j1 i0 x) l' Z

( E% Y' i1 W) F4 A9 F) y8 S" Q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( F& f. m% H8 H1 Y使用下面代码,对内存使用了mmap函数后:
3 N3 w6 B) D6 d7 @- O) \. C#include <stdio.h>
, P' h! m' E  e2 _1 l2 f$ l#include <unistd.h>
, t8 I+ G1 {7 O8 j$ V( b#include <sys/mman.h>
2 [1 U4 K2 P. S, d: C#include <sys/types.h>
% c  E. J5 ^3 q. @3 e. C% B#include <fcntl.h>$ ^8 w; j6 b) Q, y1 ]
3 \$ Q6 Z; X/ o$ ~% c* u* j
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 }: i# S( W8 i* i7 m8 t6 l( t
#define SHAER_RAM_SIZE         (0x20000)   
" e/ ^' |4 ]" i- f5 V1 ~7 M# R5 l: Q8 X# S; ?" e
typedef struct* I# B) }5 I) A8 J( m" m4 |1 A! Z
{
( H% `) y; Z9 i+ j1 s  _: V2 S3 W        unsigned int a;
2 ~  g7 l8 x8 [  u- Z2 ~        unsigned int b;5 {2 Z6 ?7 ~' Z- Q) T- E
        unsigned int packet_cout;" u( f1 I% k9 Q7 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  H9 i" m: h; y& ?6 [
5 t5 B( r, d6 ]+ C
void read_MSG_buffer(int *baseaddr);
3 N- f1 o, t8 _" Qunsigned int count_copy = 0;* P% k5 D  V7 J; m
$ n$ i) i& O0 O( Z
int main()
8 |- u9 w' d5 v4 E{5 N% f! h3 @2 U8 z3 e3 x, Z' l
        int fd;5 v  P3 d4 }" _# x0 [5 S
        int *mem = NULL;" o5 P9 x9 O1 ]2 n
- ~5 `" j" C; P9 m% y
        if((fd = open("/dev/mem", O_RDWR)) <0)1 N" O9 n$ \. h' ~' Y9 {  W
        {# v- R/ [+ ?( ]& B
                perror("open error");4 z! W& x1 f0 n6 u. ~: \
                return -1;$ R' b- x# S& N! r8 N; X5 e# O
        }
5 w0 f3 u( G: d! s4 ]8 W% b1 C0 c        * `' u% B4 S# J. j# t% A3 s, Z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 u) b) D6 J; H. Q0 h2 _
/ t" z1 d# A" }9 \9 D1 u- V        while(1), A3 `) q  N; R( P  s% v+ @
        {0 a1 S' l: _7 R9 x3 b/ v
                read_MSG_buffer(mem);+ ]2 y* r% F# _* a# _; z9 Z
        }                : x, N  S+ W+ A5 F
}3 A+ C. h7 q- I
! e0 `( Z/ ?3 b7 h
void read_MSG_buffer(int *baseaddr)' C1 o8 G7 R+ n
{- O- o: H1 D- x
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ t! _3 y3 K! x! J3 o1 h: a% i8 D9 T' }$ B
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! m" f9 |5 H& e; c4 G; e% b

$ @; ?& _' E6 H5 ?  f) y4 g( M        if(pshreRAM->packet_cout != count_copy)
, m2 `/ E4 s8 a' k        {6 D% q' K* B& Q1 M4 B
                printf("a is %d\n", pshreRAM->a);4 J4 W8 W) |& ]
                printf("b is %d\n", pshreRAM->b);5 ^9 C1 S# O3 J1 W
                printf("count is %d\n", pshreRAM->packet_cout);
$ k6 t! |6 f8 d; X                count_copy = pshreRAM->packet_cout;% y5 Z, D4 C& s& v
        }
; s7 |* i: y8 P1 m* {        else0 |8 J; ~; ?3 R
        {
. x* m. c: \$ v! p% P9 I/ ^                printf("No effective message!\n");
+ e+ Y" i: n& f9 H: i        }
: w/ a/ K' L% ]8 L% u! Q/ O8 i}4 l1 d2 E0 m# P( |' q
. K8 C; K: W" _/ h3 R( B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 ~( e" U# ?* B" H; i, T9 i9 u/ f0 p. p" p3 ]
+ T+ x3 P3 [/ ^) q
. g5 l3 g2 M% k- E0 p8 }% A2 [
7 z" [0 Y3 E( d6 B' ?: h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-8 07:40 , Processed in 0.037944 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表