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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ s1 Q+ v/ _+ N
9 n; s0 B! t) B1 K, E; `6 B- bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 U: e+ W: N5 J8 ]# h9 S* N2 s3 I. H#include <unistd.h>
5 Z( `. \3 n# |+ |7 f0 O7 j#include <sys/mman.h># `% I3 b9 C' ^( T& X
#include <sys/types.h>$ [5 |2 W% K# p8 u  ~  j! W' q4 L  s
#include <fcntl.h>* c2 [! F% W3 u2 \
: F+ T# I$ B9 U7 f1 R/ ?
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* P* E) z) y8 `  X3 I* l9 W& V
' R$ l9 {$ k- _& m, X/ W5 X: etypedef struct0 ?$ G; B4 s) Z* P$ H
{4 y8 H% J) @$ ]3 y# u, m  }4 c* s
        unsigned int a;
# a6 `3 C: T' v, A1 M4 o1 [; D        unsigned int b;
& U" m5 N7 B! J. f5 J2 G        unsigned int packet_cout;1 N# S+ u7 `5 Q6 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ a! [' \+ u1 F6 t8 o- v6 |7 I6 U7 h) n5 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 _# o# O% k5 h
unsigned int count_copy = 0;; N+ @2 a: \4 d0 n
' t4 C8 d$ X& a  |3 p& k
' S: {7 m' @) b( T  I0 k9 K
int main()
6 H+ Q0 K4 x) k8 z0 N5 c6 `{
% C) ]: v" q  H0 c        pRX_MSG_PROTOCOL pshreRAM = NULL;
% @$ X# h# I0 L, {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 a' ~7 ?' Y* b3 s
" _( w, z) {* F4 ~2 r5 @
        while(1)
% t$ o1 Q- i4 ]: M+ i$ B        {
: P3 {. j! b0 E# y                read_MSG_buffer(pshreRAM);4 D) [" T1 c" B: I9 o( h
        }               
+ p) K+ D4 d, ?9 {, n  j: J" n}
- o' S+ q: M0 e) d
; ~6 K7 n& s* v  R; |4 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* }3 e, @6 `& u7 l7 s8 \8 x{- l+ V: m0 t; D$ E! r9 S/ e. N: o
        RX_MSG_PROTOCOL buf;
8 d! L9 n- E! i% u5 m4 Q2 ]- k& a        , f- l- A" G0 ]2 y  b1 w4 Y( M
        buf.a = pshreRAM->a;7 d2 O( }& G6 @+ W' O6 {* L% B
        buf.b = pshreRAM->b;
! M$ y2 t3 y+ K+ t* P' }        buf.packet_cout = pshreRAM->packet_cout;  b3 N9 h" r4 b
        
4 W) ]; u. K1 F) D' _. o, n" h1 H        if(buf.packet_cout != count_copy)
/ s9 _7 [- r- n! A        {  D# ?, E5 O& v8 ~: n
                printf("a is %d\n", buf.a);
; Y- ]2 J8 }) Z. |( M0 s1 h                printf("b is %d\n", buf.b);
9 r" N) }* I! T* Z9 {                printf("count is %d\n", buf.packet_cout);
. Z( a/ {; w1 l2 @! W& Q5 Z( [                count_copy = buf.packet_cout;6 B, x2 W( I: I5 Y  ?
        }
! m( W  d( N' `% @; c3 A9 H        else
, Z  {: a. E# f# O$ o% P        {! c. N: u3 U3 c7 M3 w* v; q6 [
                printf("No effective message!");1 |5 W% a! e, Z) J# s
        }
: z( }' U- }5 `* n/ g) W1 U5 \3 A# z}& L# `; M" S4 m2 V
( w: n2 D0 M7 u) |

! W, j) w1 `( v5 M) ~但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 r9 P, K9 d9 q使用下面代码,对内存使用了mmap函数后:
" H- ^4 q' X8 z# x9 C6 a* V8 M#include <stdio.h>/ u9 _( r+ v; S/ m: j  U4 ^+ h5 I9 Y
#include <unistd.h>& \% Y  h0 e, z( r
#include <sys/mman.h>1 [: w  |0 a2 g& W# G  }, W+ d: p
#include <sys/types.h>
2 K5 t1 Z9 |4 I2 m1 p. R# d5 g; D#include <fcntl.h>+ a& a0 i& E& i! A6 ^
" c8 ]: I. I+ _0 V5 G/ o+ r( R
#define SHAER_RAM_BASE_ADDR    (0x80000000)
! ~8 ^$ K" _  ?/ T( g9 m#define SHAER_RAM_SIZE         (0x20000)   
- E  h& M$ n7 Q/ }" e3 j- n
) D) `& B1 A8 D7 \( Btypedef struct
9 T+ U' p# B" B, d- m, `/ t{  C/ {6 `; V1 Z5 z5 O& }
        unsigned int a;
5 G3 w% z2 w  D) G; @        unsigned int b;: Y( y" n/ s! s  W! D: n
        unsigned int packet_cout;* \/ R: f- E6 Y9 z! {1 F/ N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% Z# V9 ^$ M$ y  h2 l" Z8 Z3 {6 s
void read_MSG_buffer(int *baseaddr);
. K& q3 h2 ~( Q7 i( N; n9 J) Funsigned int count_copy = 0;
2 i# a" O' k' p/ g0 ^
+ }$ Z1 P! n6 G& k& c2 T! Oint main()
2 K) L* [4 e: d" N  I) X8 y9 h{- R  l$ i. Z$ I; h' E6 O
        int fd;( ]* h7 ~; T4 L
        int *mem = NULL;
% m+ @  j' P7 e0 z' ?+ P0 j
6 D, ~; _8 O3 j2 \) n! z        if((fd = open("/dev/mem", O_RDWR)) <0)
  h9 o9 b  B) V" v! b0 ?$ k        {% Y4 {# [8 G) r. o
                perror("open error");
$ b  E+ d9 V; j0 [                return -1;
) e. a% ~6 R! ^+ s+ V2 p        }, g% s5 K* s* n' ~
        # `. i- o. f" `! b. V# r8 r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 B. |  Y& Y. z6 A' P* i8 D
1 T& V  J# b8 U0 _; p  D
        while(1)
1 h( a1 [& J. z- R# o% h& n: {        {: I; _+ E7 P+ \! u
                read_MSG_buffer(mem);  B+ S! |: W. `+ e: G7 B
        }               
# W4 `3 B( ~( f6 d( b: s. s; b}0 F( e& v; D- ]: |/ _; J1 o' w6 e- R% _

( ^8 s1 m' `" b# ~3 |' |/ Pvoid read_MSG_buffer(int *baseaddr)" |+ G) w# q' W8 Z8 n$ Z1 ~3 h
{
9 B9 Z2 @/ a3 `6 j8 O' q        pRX_MSG_PROTOCOL pshreRAM = NULL;2 n# D8 }2 n2 r6 q7 f& C
4 H/ S: K& d$ m6 u  C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, X6 p; s. \# L' Y" j  l+ n4 l$ j

7 l& x% F5 t3 f" J+ ]  w$ x        if(pshreRAM->packet_cout != count_copy)  [0 Z* C9 P" [& `# o
        {/ M  U+ C& ]3 L2 V- K2 |! y
                printf("a is %d\n", pshreRAM->a);
8 w$ C0 G2 g0 o# a                printf("b is %d\n", pshreRAM->b);
3 o5 C, N& S- v                printf("count is %d\n", pshreRAM->packet_cout);
8 L+ v! H1 b1 v. a. U                count_copy = pshreRAM->packet_cout;
! t, E2 O" X  f        }
" w. v/ {1 o. X& a) W2 |3 [        else
6 s$ L4 P% o! r" J2 ]0 c        {
: l* w! k/ F7 Q. G                printf("No effective message!\n");
% [5 w2 E/ ^0 o3 D* R        }
! I8 b# r3 F( z}
& U9 U) S) v& D  A/ r2 m' Z% H# N6 s% w6 F: K; H* n; w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 e; w% h) R; z& |7 K( e) V5 p' f
/ B2 z- {/ x$ R; A) b
6 L5 }: c+ K0 S2 @7 m) ]
) d, `8 }/ M% n" W. r0 x* N2 h  r; |5 r4 ~* @# Q) F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 08:01 , Processed in 0.039940 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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