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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, i0 E' R& t) h9 ?- R0 h6 T
7 \8 F' g1 {: S5 L4 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 Z- W4 |; i- Y: r( e; [#include <unistd.h>
8 q( d6 C+ h) j" p6 W9 [; M#include <sys/mman.h>
3 Z; t+ Y$ D9 R" i#include <sys/types.h>
# O# u; [+ f3 c#include <fcntl.h>
: y, S; ^9 G  m
6 R  p% ^3 |- E/ `" a#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 }% @8 p- ?- u3 S0 r6 |' Z

6 [3 ^+ |* w2 _" L) A# |typedef struct
2 u' O8 e- [) ?/ p8 J! d2 c  m( }{0 L& k/ i; m. m8 V
        unsigned int a;
* Q2 y: l+ _3 {- l        unsigned int b;
' A6 f! t6 o; W; e        unsigned int packet_cout;8 M4 m- u9 ~3 X/ k5 ^3 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 [! G( x8 X, Z1 o/ S% {. y
; w" Z4 ?9 N6 L# U9 X1 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 p$ v# t8 a/ F! C/ P! O* C9 l
unsigned int count_copy = 0;
, E" {$ L1 u6 n5 a& U( m8 ^
, j# ]% a) L! n  Z& w+ }7 n
( j  J8 X, s: V) }& J$ bint main()
0 a6 e7 @- A0 Q5 d{, t/ ~+ c0 \8 x7 d0 x
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 R& a* h4 Y( ~- b        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 B( v( o6 O+ y+ m0 j7 e9 c: z. ?4 w8 J3 g, ^) k5 Q
        while(1), D( d" A0 A" M
        {7 o& f4 [2 D* S6 c7 \- f
                read_MSG_buffer(pshreRAM);, ~  R4 F# e& a2 k: k4 l0 U
        }                2 X7 m  F) a, v5 B1 [) W/ b
}
. {8 Z) o9 k% f9 D$ e, ~0 R
* O; A' G3 ]6 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" F( r0 Z9 M9 P{
9 v; w. w( l% w        RX_MSG_PROTOCOL buf;
/ h, P0 W/ Q, Y( `        
& z2 n' ?5 o+ x5 p        buf.a = pshreRAM->a;- u: b) S" `3 \$ O) z/ A
        buf.b = pshreRAM->b;: \4 `+ P$ S- a+ K1 S
        buf.packet_cout = pshreRAM->packet_cout;! L/ Z' V( l8 ?/ b7 B1 h
        
8 J& w7 T5 U1 W. S8 A- t        if(buf.packet_cout != count_copy)6 D' A0 w2 N: E& e. ~
        {
0 z/ h  T2 p' P2 d9 `4 f% d: F. p                printf("a is %d\n", buf.a);; ~# B+ q3 @9 _! U" o" B
                printf("b is %d\n", buf.b);
4 C" L" D4 C$ V  v2 m8 v$ D& y                printf("count is %d\n", buf.packet_cout);: q( Y% |. f- f- E9 {! }
                count_copy = buf.packet_cout;9 D" _) t: Z9 ?* A$ J* G
        }6 I; `. r- `8 P1 @6 W, u0 s
        else
+ E* Z" h* [/ q% ^0 l        {
% L9 `% j9 x; d* b9 t' W& s7 A                printf("No effective message!");
) ?, v# o7 Y. W  d- g        }
3 T- C! X/ ^" E# M}
4 K/ n6 b7 j! A8 j
0 G2 S- v% p" w# N) W
5 f9 b) w6 {2 l, X8 l5 [( L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 }& }  X% g) U使用下面代码,对内存使用了mmap函数后:
) C' R1 S; a. H+ T#include <stdio.h>
' K1 q9 P- B* ~$ O: P! s#include <unistd.h># z3 P! G7 S. ?! ?) D9 c
#include <sys/mman.h>! |& C& K) P1 K8 h) I
#include <sys/types.h>5 I- `8 W4 j/ z! S2 P& |
#include <fcntl.h>7 @8 k  [: j0 ?

, ^. P( Y/ `: X# w/ K#define SHAER_RAM_BASE_ADDR    (0x80000000)
) s! D4 H6 s. _0 S$ r2 Y+ ]. Z$ `3 _& w#define SHAER_RAM_SIZE         (0x20000)   8 ^9 C7 Z+ u2 k) C7 D/ N
$ m  i+ e  q" j  j* U# g- t  P
typedef struct
9 O/ K, M8 G; h# E# N{
* P* U7 E/ }% _4 \* o        unsigned int a;. D% C. Z& B5 j1 q& v
        unsigned int b;4 m' ~: r4 L1 M$ M* Z4 \8 P$ t3 z
        unsigned int packet_cout;
0 ~! ^, ?( X  D5 e' t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. n1 @: O+ A% X3 D- v( q4 S: z" W. _. |) R9 W$ S
void read_MSG_buffer(int *baseaddr);2 b  ~3 A# M% @5 F7 j# G: v
unsigned int count_copy = 0;3 N) l( ^/ H% n: W
" ~- L. `+ f3 F* X/ K6 r& L- N6 C/ z, v
int main()
1 o! B4 L. _9 N* y( x{
4 ?$ Y5 n& m% }) d5 T8 j/ C        int fd;: h7 ?3 D0 G8 T3 l8 C
        int *mem = NULL;5 Z- I0 A. r& t
2 Q6 p, X  H, O" Q9 m  `0 A4 B
        if((fd = open("/dev/mem", O_RDWR)) <0)
. |# H8 v2 L7 t# P/ b' ~3 p6 I        {- [9 U1 R2 |$ F& {1 `
                perror("open error");6 w  F7 A5 x$ ^1 T5 b
                return -1;+ V- r3 ]# L4 _2 {
        }
. Y( @, D5 d4 m: p" D        
: |$ K% @! Q( q0 Q' v6 l        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. _9 [4 S; _# L( J6 r

8 ~% [! c! W$ x        while(1)
5 n/ j9 \0 |, r* ]        {* j4 X* H. j7 V8 b' m- o
                read_MSG_buffer(mem);
+ l9 d7 ^6 ^, t/ L9 |- E( s3 Q        }               
) X  h9 O1 V9 W/ ~: L}
  g+ n8 P* l, Q/ Q" x. v& y# B. W# L. M+ K: |' g
void read_MSG_buffer(int *baseaddr)
) z$ ]& M$ Y4 X2 U9 d3 n{( @( X+ L# @# `- t9 j5 o
        pRX_MSG_PROTOCOL pshreRAM = NULL;- w3 }- t& d9 H% e0 W% B+ n/ s

; t7 e: g0 @  R4 C7 I        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& X* X& o* C6 |, o
3 ^; ^5 _3 q  F& o8 c
        if(pshreRAM->packet_cout != count_copy)
4 F, R  R/ g2 E3 e* L% T, ^7 y        {
6 P4 x0 s' q2 V1 s7 K( B, A                printf("a is %d\n", pshreRAM->a);7 W2 m- {( J4 }, {
                printf("b is %d\n", pshreRAM->b);
( T! T& R  O0 j) s                printf("count is %d\n", pshreRAM->packet_cout);
, Q8 S4 V: K  w' @                count_copy = pshreRAM->packet_cout;9 E1 t; y/ u+ N9 o- B
        }
  z: f. y/ o2 r" r+ m        else
; c5 p. w- I; Y" a/ L- j- R1 {4 C        {
3 j( m) M+ Z; Y                printf("No effective message!\n");' [  Q. g& T, |( f% V' d$ p! V
        }' b* N# d5 }  N' O1 ?2 \* p: _
}) j$ \5 n3 x" h  b4 n+ M6 e
: ~0 w. X. w9 p5 T: O: J7 Q( Q# [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 i9 _" E2 k. h
1 i. ^& j6 u! ]& S9 }; z( x
  O  E& q8 ^+ I9 |5 H* A% X5 h3 F$ \( |

5 H' c& [% @% e. s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-15 08:26 , Processed in 0.040207 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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