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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. B8 [4 g6 u8 \" T: G# N
# r% ?- Q$ t7 d" ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" x; S* W1 w" p$ |8 s! p( E7 W#include <unistd.h>
/ w. j# B/ Z' i8 D$ q#include <sys/mman.h>5 ~1 w6 P& _0 c
#include <sys/types.h>9 o; D7 e4 C# C! w) {& a/ t
#include <fcntl.h>
5 R" E# H8 i. z: A2 G, M6 m- P, B5 a5 }: C# ~/ S3 r) D
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 a9 s% O; ~* F, `( |" X: |* L' O$ F; R$ r- o. H* x6 \, Y
typedef struct
+ z  e6 v. S3 J$ B2 m{* x+ {5 E+ D: X/ T
        unsigned int a;
! N( o+ y2 y5 O. X" I        unsigned int b;+ H2 I' l' [" X
        unsigned int packet_cout;4 Y1 j+ p1 a/ v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- q( m, K5 C5 v* e( v/ q
8 D/ w) q% S2 W3 k/ gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# [: N3 y* [% W5 \unsigned int count_copy = 0;2 H! h* @! f% U

! n: I- {0 ^+ R: d
4 g) \; @3 U- Mint main()) W2 g1 a1 ~& F8 ?9 ^$ F: X9 |' ?* C
{6 C, w9 d7 u. \- W" m
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; h9 W* q% @5 F* K, a, f        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 {, |" a0 ^3 t! ^! R  Y
+ `+ C3 D* Z7 w        while(1)
, F, F/ g; J0 n* d  T        {. _  K: p) f; g: _, Z5 z2 c) ^
                read_MSG_buffer(pshreRAM);1 s# Y6 \% f" j4 J2 w9 I4 {* l: L& ?3 S
        }               
2 I- U3 q" Q/ g}  |4 ]% J2 M9 O% f( Y) o+ i8 Q$ p
' d2 i0 |* e' Y8 @! q& }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- A4 l4 h: `. F
{- J. u% w! W& W7 ]4 N
        RX_MSG_PROTOCOL buf;
& y- K. g8 [4 n        
  W2 n- W* k( G        buf.a = pshreRAM->a;4 _* y3 x+ X$ y* l1 b3 p0 x
        buf.b = pshreRAM->b;" t/ p, N- C6 X: a+ P: R& s( _
        buf.packet_cout = pshreRAM->packet_cout;  M) n8 k8 J6 N1 s- }
        , p. |7 y& Y+ Q( P
        if(buf.packet_cout != count_copy)
7 r7 n/ u* C( A- G* O" }        {
( s8 k+ @. b) o; v+ Y                printf("a is %d\n", buf.a);
! g; k+ v) a1 J5 O                printf("b is %d\n", buf.b);1 I6 a$ z5 D& T& L1 I
                printf("count is %d\n", buf.packet_cout);6 q( M, V1 B4 A5 f' O3 Y) J
                count_copy = buf.packet_cout;
. i7 j" w9 P8 m        }, T2 q  O& [9 |- k6 {# B* @8 O
        else; j( y8 m% f2 y  E: b( s" ?! y
        {
& s- ^. x" O# V7 D3 C1 Z8 E  v& Y                printf("No effective message!");
" X5 {; I8 x' n* |6 U        }
5 M8 U0 f9 h% a: E8 K}+ @5 t+ }1 \1 L/ y! u

& e) P; Y" G, H9 }8 [) v) ?+ {- D" K$ h: d% m: l( L3 m5 @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ c/ e* @. C" p1 e. q* k( ?' N使用下面代码,对内存使用了mmap函数后:) ^7 l7 k3 }5 M- q4 {6 P
#include <stdio.h>8 C" G" G. F4 e
#include <unistd.h>
+ E# V' E! }6 b* K: Y; ~#include <sys/mman.h>
0 |! ?  Q' I3 J: v  C- W  [#include <sys/types.h>8 I  I' M7 o1 y4 _. s! X' @4 }
#include <fcntl.h>
% l8 f1 `5 U: i  g# l
) f% Y* y) P2 P6 A. ^#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 T6 P  D$ e( |+ B2 ?& s; h' q#define SHAER_RAM_SIZE         (0x20000)   
! j! _  i; [1 D9 i# }& g/ i( O
+ M$ q0 R7 `2 d* I, q9 o1 L0 Htypedef struct4 w( B5 y5 V$ o3 ~2 i2 Z. A
{- j& \+ Z6 a. Q$ k+ M
        unsigned int a;5 |" k( ]* B0 [3 E, s
        unsigned int b;' }) j* L( ?, r8 u
        unsigned int packet_cout;; ]) M. K: G3 P" N% k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 X9 @4 d; \' V/ h  n; C5 Q! H9 k3 G9 G
void read_MSG_buffer(int *baseaddr);
& w! a, ~: x* d, junsigned int count_copy = 0;: Z3 Y" u* Z1 I

2 L- b1 ~! `4 ?( U; e- G' qint main()0 v2 f& _: |- `
{
) q% i) s; b5 V* c% }        int fd;4 I( _% D, ?. x: d) O/ g- x
        int *mem = NULL;) q0 v& V+ A  m9 B) Y9 B
2 z  m$ S# I! g1 Q
        if((fd = open("/dev/mem", O_RDWR)) <0)
% I$ s# P& |7 G: ~( |3 a2 i, v- i        {5 @) ^' w! h: l, S8 Z. u8 F, t. z- M# L1 ^
                perror("open error");- I. @7 t: c" k7 |# a- e
                return -1;
* T; z! V: g& a" D. @        }
/ H+ S" u/ f$ U6 J" n0 G0 q; _  L        ) S6 S' ]  M/ n9 D5 x
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- e; e1 l+ o) b8 W) K9 M7 z
, Y4 c; w& z! O8 [; b0 ]6 _
        while(1)
9 c) I1 f5 a7 o9 V' ~$ \) V        {
! r7 t' e8 x2 c% B3 U. Q                read_MSG_buffer(mem);+ L; l0 \8 G* H$ {5 M
        }                5 Y3 m; R; Q+ H" l" y1 E7 |
}7 ~* I/ _( w% N+ D
. k2 J5 |5 U3 i1 j  K% H$ j5 L
void read_MSG_buffer(int *baseaddr)- v5 B( n* h9 S+ X
{
9 I- x7 O* {) o! o  V        pRX_MSG_PROTOCOL pshreRAM = NULL;
( Z4 z) |  x, w! e1 w8 O. H' k6 H% ^4 L! x
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  O' s% M7 @6 E3 D( w
1 f8 _/ H) Y- c; Y3 P+ [4 P        if(pshreRAM->packet_cout != count_copy)- _: F4 ]3 H2 v) G# `
        {, @, g% w/ A9 w
                printf("a is %d\n", pshreRAM->a);% D7 W6 v& L# F- |) o* l' r% C
                printf("b is %d\n", pshreRAM->b);
6 L9 T$ t5 M5 h" f                printf("count is %d\n", pshreRAM->packet_cout);
6 `8 m* e3 K* x' y                count_copy = pshreRAM->packet_cout;
4 ]: F9 f/ o4 q2 G0 R        }
( U8 p8 J5 Q% G9 E        else
& a' |5 n* O( q, Z8 I- Y/ G        {
/ }- a# n, m0 A/ T# H                printf("No effective message!\n");' ]5 `! {+ C# K1 @
        }
7 r" Q1 P$ s  \  d2 ~! J2 S}) \: h; S; u9 @9 O5 v
7 t+ ]4 i  I% @. p, ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) j# [" G# L3 `+ h/ l6 P3 l) D+ U! ~; O$ d+ z- w5 U

/ }' I" [5 f! Z7 A4 ], z  s
7 W* ^+ n. j# }; r- a
+ O+ u; v% X& H) F: k$ x: I* J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-26 04:32 , Processed in 0.042429 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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