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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, ^' D1 `' `' n6 j& g0 k: [% z  {) d" t) k- Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. R7 e" v  \" m( L#include <unistd.h>
4 ^# S: c. Q+ K0 }#include <sys/mman.h>+ }$ W  Z! j/ h, L# H2 z! O9 U
#include <sys/types.h>: L, k3 r  f3 C$ G$ q5 H
#include <fcntl.h>
0 p. W* V7 V! f) l) J% V
' s& X2 a4 B5 e' \#define SHAER_RAM_BASE_ADDR    (0x80000000)   . J/ s1 h; ]- ]  G
& p( {: D7 C( ^: N2 _# @
typedef struct
+ }! [6 t* M) H{4 k: N0 ^4 s  d! y) v0 [
        unsigned int a;/ t5 W6 Y% N0 _' [# Q
        unsigned int b;+ f# i  _: F$ e. O2 s/ P
        unsigned int packet_cout;1 m) H. [3 V1 v; J+ q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ k! h( q. X1 }" Q% \: T
1 H: W* A% ]  T% ^9 |+ m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' G/ j- l( K9 {# runsigned int count_copy = 0;
- d* z' a4 M0 x# Y6 X( ]9 z$ p- a, _8 R, V) G8 r  G. l' r* P
5 N* E" Z( z) D
int main()* x( Y7 q/ @% x* D+ V' o7 _& d8 v1 V; n
{) l5 b" [9 O* K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 y) B$ G' x4 ?        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 L' v: U6 |5 S( Y) \7 d7 d& W& r. Q) A
        while(1)
1 C* I( H: d5 E& O' R; C- V        {+ a) _' J/ G4 B6 ^9 K9 Q% a7 g% l
                read_MSG_buffer(pshreRAM);
: @6 p9 {! {. P1 J) x- `% K& H) M" `% m        }                $ J% N  J; [/ s% h% V+ k! W
}- w0 E$ H4 y- ?, P

' p# B. G5 P& S, Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! B' [$ u: O! h1 b( p2 G2 k{
" R- c/ B+ ^! {        RX_MSG_PROTOCOL buf;3 {  S; @1 [+ z
        : y' ]9 N, R3 S: f5 j
        buf.a = pshreRAM->a;
4 J! R1 B6 L% I2 v6 n        buf.b = pshreRAM->b;: v5 Q1 f: L( A+ \, [2 k
        buf.packet_cout = pshreRAM->packet_cout;
9 U7 V2 K' T9 W7 G; I  N1 k5 P( K4 O        
4 o9 f  A3 V$ e  O4 x        if(buf.packet_cout != count_copy)
) ^( r% u. h% j- R        {" `9 {$ O; a; z1 x+ m4 H' c; L
                printf("a is %d\n", buf.a);
% Q1 O) c6 q: n                printf("b is %d\n", buf.b);( Q2 n# g" H3 M) |, w* a# @% I
                printf("count is %d\n", buf.packet_cout);
& y6 p5 i/ N9 b4 O9 [* T) v$ N                count_copy = buf.packet_cout;
% F  a" P8 j8 Z1 H        }
; G" q' a+ @* A, j5 ?- Q9 R' x, }0 \        else& U6 v$ ~+ \" d; J# W
        {4 A, }' j/ @+ K' L" d- V
                printf("No effective message!");$ c; ]) e" p' f$ j9 H
        }8 c7 }, U( d; K' G2 R$ k# J
}
. m" }+ O0 W' O! _
: c7 E& ]( t, D/ T
3 N* Q" a: S- e$ I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 i' \' }" J9 A3 m: O
使用下面代码,对内存使用了mmap函数后:7 a7 ?% ]5 Q* J: w7 R' b- q
#include <stdio.h>
* A6 j" e$ R* i  @#include <unistd.h>
% Y( a6 R- |; Z( z9 |& w& @#include <sys/mman.h>, ^: i" l" A& k& n: A6 I
#include <sys/types.h>
6 E% T1 D& w, `% ]2 P#include <fcntl.h>
0 C- w8 a  Z$ j) u9 ~( m9 a' o1 v3 ~% u6 D# d( {
#define SHAER_RAM_BASE_ADDR    (0x80000000)) [7 b- N7 _  g0 L( I2 k
#define SHAER_RAM_SIZE         (0x20000)   
( M4 u' J3 b! v* I" Q* x5 i4 ~
! D6 J1 C2 e( x- Mtypedef struct9 {, I6 S3 |. a) g4 J- B% z& w
{
& @- Y2 S5 {2 w" l        unsigned int a;
  E: M3 e! t5 }  s: Q6 t% {        unsigned int b;
! L4 y1 l- I* b) t" ^9 U* E0 M7 V% }        unsigned int packet_cout;+ T: O0 `+ C# r; T4 _! q% V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" [* s" e* X: f5 w: C
1 Z" J4 \: Z0 N8 u# a9 H5 Tvoid read_MSG_buffer(int *baseaddr);
( d& ^" b- }, O) M; `& k6 ?unsigned int count_copy = 0;
0 s4 j( A4 b  j$ B8 V% ]9 c0 x1 V# [+ E% {: o1 E% p) v+ s
int main()% J# W* ?6 t6 j) v
{
" g( @- o( x/ A& |8 M4 g        int fd;
6 j( Z! E6 n) D4 \4 U5 u4 A* ^  ]+ P, L& l        int *mem = NULL;  N5 g/ r; p( t. e
8 u* \8 {7 j* Z! ]. |
        if((fd = open("/dev/mem", O_RDWR)) <0)
' V% v- @1 V" c8 q6 G) {        {5 |4 u1 X- S; ?! n' `
                perror("open error");# T/ V, D+ r7 A
                return -1;
2 x1 j! r9 f' g        }# h" g9 N+ {; h8 b: z  T. [2 L$ s( [
        
, I' i6 M* }% O- o6 w        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 T7 [8 M1 @- X
2 J1 }+ b5 C' n' k
        while(1)
- g& X! J$ n8 i3 E# h5 V) L        {
" c  r  t* {8 B( |                read_MSG_buffer(mem);$ y3 A. ?; m5 L0 C# h
        }                % a7 V/ t. q  J7 [2 A
}
. {5 J; X1 M0 U- \1 k' @( q+ K3 v  A  X
void read_MSG_buffer(int *baseaddr)$ o9 e& N4 t. I; g: c, C  u: E
{
' P* u: u! E% L# r        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ ]) P( {7 G% j
% b! Y' C( ~/ y2 W2 O( {- P/ ~  f        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ V. `6 F6 N/ r- M# S
4 \' }, C' {( H$ P        if(pshreRAM->packet_cout != count_copy)
7 ~3 c( H; ]- E: ?' C% \2 z4 k        {6 Q: t  h; E7 V1 @! O1 G$ ]
                printf("a is %d\n", pshreRAM->a);" q1 A( \, k2 K) ]9 k, l
                printf("b is %d\n", pshreRAM->b);8 o" Z# L7 V. q! N" W' o
                printf("count is %d\n", pshreRAM->packet_cout);$ M4 T1 v" W! `& h! T3 C$ ?
                count_copy = pshreRAM->packet_cout;4 T6 U7 h5 S6 `1 T0 F/ w
        }
! T* s7 B0 \, ?7 A* f' w        else
: J6 O) f' \2 @3 |        {  W+ d' O! x3 |# S1 t% ]
                printf("No effective message!\n");
. Q" r+ C* X0 q; g- J6 R2 ~* u        }- y5 E. P5 ]2 @5 P8 i7 A8 y- B
}; b6 H# p3 R: C
( L! p: K1 j0 U9 L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: h8 c& E/ K! {8 @: `2 c) `/ Y. r; j: _! t

8 l5 a7 A; C+ T1 ~7 N7 E( m' `8 h3 b  g2 w
4 M% M. G' y& U7 o) q' C' `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-4 01:08 , Processed in 0.044010 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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