OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 J- d3 J3 l6 e

& C0 w. {8 g1 z3 L& y# W9 xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 i; i) r1 ]1 B  h+ f. k" }7 a#include <unistd.h>- Q! c8 h+ R, Q6 @8 m
#include <sys/mman.h>
% R- \1 g5 o! V/ p4 }#include <sys/types.h>
+ T" l" K9 C0 W. J. T2 ^/ I#include <fcntl.h>, }4 }# R1 O. x1 }) }8 w

! w) o' m: r  S/ I4 `' G#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; d* l% y4 b' s) r8 {
+ |, I$ x- A' i5 u3 Y+ _typedef struct
) H3 x$ V5 q6 ^9 \: ?{" d3 F6 g8 g! t
        unsigned int a;4 R9 }2 l# k5 V
        unsigned int b;4 E: ]( x2 U- P, R" r- s) w5 O: X
        unsigned int packet_cout;# \; e3 U+ H8 V5 k) @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* I  b& J. T/ a. I( M
+ R% q( O/ k$ E  Y9 d& gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 H6 A& S# m5 j$ Sunsigned int count_copy = 0;
$ o3 g3 E' D# ~) q1 n& |1 C" I& C( u) X2 |: g9 x  V

; t+ H- m( v6 E) h9 n1 Z8 ~int main()' K' |$ A* f: B0 n# Z8 ?  q% a3 C
{
" P8 |, e. P6 ?5 C& y/ B        pRX_MSG_PROTOCOL pshreRAM = NULL;- h2 M' D5 |7 `4 h& `( s# l6 V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& o3 ?% I( N& f  n& E6 h. u2 O7 F
        while(1)7 F+ `+ J! W9 P
        {: ^( m9 g% V4 R" l) }
                read_MSG_buffer(pshreRAM);
' z8 F) a9 [) T7 t! P$ H        }                7 X' ?- \: Z1 e
}
+ ?$ a. Z; i6 X& d  m9 o; F% A7 H0 h  R1 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! I! w7 m: K8 [: U  B0 S, |# t6 M{
* v8 ]: L& A  T5 a8 [" A        RX_MSG_PROTOCOL buf;
3 A" P% W( h1 Q3 R3 G4 N        9 t$ ^. B* L  h. A
        buf.a = pshreRAM->a;8 u  T- ~- G$ H& d
        buf.b = pshreRAM->b;
9 z' ^0 I9 f. t2 ?        buf.packet_cout = pshreRAM->packet_cout;
* ~2 K3 @* J- ^6 f" L        
, |* U( c! j+ w- R, r; d5 u        if(buf.packet_cout != count_copy)
  ?6 J* w+ D! [5 R/ e5 K7 G+ m        {
8 N% ?+ c, C! ]! [3 E+ j                printf("a is %d\n", buf.a);
$ W& e0 s2 f( b, r1 E2 j                printf("b is %d\n", buf.b);
% S& j! x% n# Z9 r3 U$ n& H                printf("count is %d\n", buf.packet_cout);! l, j8 e! {" f' l& |8 h, d0 o
                count_copy = buf.packet_cout;
- t8 Y0 E' G0 E2 a9 Q" q        }
& H$ L8 x( G& v/ l7 I        else
$ Q) ~0 X% u. ^2 c( t- ?7 ?2 f        {
0 D; s% h& L4 R7 j                printf("No effective message!");2 _4 M- k& l- R5 D8 M
        }
# f: _% J+ R, W, @+ [, N3 L}
6 j4 @( z7 |* z' u/ }7 U! j4 |
* x2 N. s, ~5 l2 u* h4 q6 {4 a$ p4 x9 Z) `2 j3 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* h- ?' h/ _) B7 S+ X使用下面代码,对内存使用了mmap函数后:2 i+ R+ @- ?, [2 ^" e6 H5 R
#include <stdio.h>/ ^  N. ]' B3 J. |
#include <unistd.h>
  M6 c1 d5 G0 j& y% a0 r#include <sys/mman.h>
6 s* L& a( Y: i#include <sys/types.h>' r, o) n7 h0 N% A5 I
#include <fcntl.h>
: v' l, r7 h5 b) @5 U& \; G) \# H! B' g
#define SHAER_RAM_BASE_ADDR    (0x80000000)
. d2 T: ]; U+ h  C, J- m6 B5 I" k#define SHAER_RAM_SIZE         (0x20000)   $ z: ?/ Y$ x9 c: ?9 _: v1 g3 J: |7 w
9 M  A' S' P" x$ {
typedef struct& L& L4 ?, M1 l) s2 L( B
{5 U7 A) r! u7 V9 z
        unsigned int a;' o. O4 B. o( y7 w! [" a3 R
        unsigned int b;
' h" |3 i, u# K3 C, k- d! H6 W        unsigned int packet_cout;
, B. j9 c* r' P* b2 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 r: O3 J; Y, z3 d) F' d! F' K# f$ G
- @% I; m5 r- @+ m% l& f; d% V
void read_MSG_buffer(int *baseaddr);
4 R8 w& p" C- a9 n% [' }7 y% munsigned int count_copy = 0;5 [8 v, \9 b. I* o& ^
' p. e. l  ^9 [( k0 P3 q
int main()& y& \. X% s- {+ p
{
6 n( d* t9 Y9 T. ?; W: j        int fd;
1 u  s9 W0 K% K( w5 B/ v        int *mem = NULL;
1 _" m$ L4 o5 n, Y! M0 y, B+ Z& u4 @" a* P4 r1 _/ s
        if((fd = open("/dev/mem", O_RDWR)) <0)
. j/ r" s8 T% f        {( x, Q$ a( I/ _3 S
                perror("open error");
3 q( @6 E# |/ v5 J2 L/ h                return -1;
( e1 b7 S3 T6 U/ k- }  R/ o8 c        }
! _3 z' J; e7 [3 R% l6 t, J' U" d7 A        
: S  \% g  T3 z' d        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- M3 q, ^  ?/ ?% J* B/ b
! L# i6 l2 [1 i$ p! g3 S0 r
        while(1)  p" ^  r0 I; S; F
        {) t* {+ m1 g, {$ J# `
                read_MSG_buffer(mem);  B9 U- M1 T. w% ]& A: H0 M
        }               
; _( r9 d  v5 \' m3 U}3 R1 A  ]% P* c  c. Y
; \+ b8 z" k1 ?
void read_MSG_buffer(int *baseaddr)" N8 ?' F0 R" s$ k5 t1 M
{5 T2 Z- r2 K& Y( ~& T; n
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 x8 e( K' D4 {: P& q5 H. t' A8 z. b5 l6 N& ^1 a. L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 k3 \- l( C% ~/ |

. N# _; f! U1 _$ d& e        if(pshreRAM->packet_cout != count_copy)# L  N9 C; I& }2 e6 M, S- E
        {
! n7 _9 l. c5 |8 d9 H                printf("a is %d\n", pshreRAM->a);
3 Q7 [- F4 ~- k7 V6 B. _                printf("b is %d\n", pshreRAM->b);- P$ Y! f' y) T" G: e
                printf("count is %d\n", pshreRAM->packet_cout);
5 d9 ~) _5 z8 z4 B& x- ?                count_copy = pshreRAM->packet_cout;" x! u" g6 o5 _& H' |& e# r
        }* ^& c+ r, v7 |: A4 l3 J
        else* M( E2 U6 k6 G  B: \; A
        {
9 r9 T, B5 U! t6 l/ F# s                printf("No effective message!\n");
- G# }. s7 T* `( j" _0 q4 c        }- @% s4 S% Q0 N4 F: F' n5 o6 }- o# o
}
9 w$ C% f: v) u: ?, O2 l- l4 B+ D2 o  H* k, f! B* w1 H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 w& t( T  I1 x
5 I3 L- ?5 c  v6 k8 `, t8 F% S1 K
) {1 s5 j$ R% S1 i, i# b
% l$ x/ b0 C: R, X! K" b4 t/ n
, R8 t" U6 V$ c# y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-16 07:27 , Processed in 0.040231 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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