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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : b) V0 n$ l8 M3 e7 S$ ]$ s
3 Q( f# V: t+ g# @, D& T, c' ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* M& G0 A- @- V& z4 |3 c6 u
#include <unistd.h>1 S% B) W( v* Q' W  J0 Y5 T$ i
#include <sys/mman.h>
. [; ], x1 m8 t) u' I" e#include <sys/types.h>
. Q8 ?0 {* N% ~#include <fcntl.h>9 M7 c& B7 R- N7 e7 s2 H, k

/ ~5 F5 E+ v& ]; ^8 Q#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) {0 ?3 l5 {7 y* [( _  `; c( S' C3 i* R& Q
typedef struct
" j) S! ~5 @! k# ^% L+ Z# A- D5 i{% D! u" J+ d2 z* w3 o, t$ G
        unsigned int a;- W: o: r! g3 a
        unsigned int b;
/ `3 ]. u) |1 n+ ]8 m9 ~        unsigned int packet_cout;
+ j* J9 f) @4 C7 S. [4 Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  y% J# p$ y  p& d; K2 A4 l
, g, s9 ?# ]3 s- B, Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- d2 C2 Z3 A6 z/ O! X' c! punsigned int count_copy = 0;4 a) R2 k* l$ _

! y$ {; b  w/ t0 C- p0 ^" j# T
# |( K) J; H+ D. M3 g; T$ h! R  pint main()6 m# M+ y1 Y( J2 m- @
{8 R9 s7 D# U$ a- F9 T( ]8 Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. U( a$ q' ^7 v& _' y/ ^+ r        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  f% |* Y3 j$ S9 v5 m' n. t
% L% P/ v1 [6 N* v. j8 F/ N        while(1)
$ ]. I" w& D3 l( ~4 K- D) ]8 ~- r- j        {6 x: w4 r: P; C5 W) d
                read_MSG_buffer(pshreRAM);
6 X& A3 ]) j, k, u. D        }                # i" n3 s# P2 v& x
}
) c: i7 h8 ?( p/ r5 u+ y4 s' I
3 }3 `4 A3 `" G  h4 cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( t1 _' q4 f6 Q3 g+ r$ u; d; q: D{
0 O7 y' M/ \2 K0 T8 O        RX_MSG_PROTOCOL buf;  @7 G/ U0 {2 ~4 U
        * M- p8 b1 b; U/ m
        buf.a = pshreRAM->a;
" d; j2 }: f1 U& r2 E, Y# g8 }+ i: h        buf.b = pshreRAM->b;
7 Z$ A; m6 ]# d4 [. w( u# B: p        buf.packet_cout = pshreRAM->packet_cout;
2 G4 ?3 n! A$ u! b+ C        
( r6 s- E% Y0 H- G8 ]7 A        if(buf.packet_cout != count_copy)
0 ]; y. |2 K" i" H- p6 ?1 Y* i- R        {/ o9 F( `( X+ o
                printf("a is %d\n", buf.a);, o# ^9 x' W9 D+ W
                printf("b is %d\n", buf.b);
" R9 C* s& t$ G+ T) L) n5 ?/ W                printf("count is %d\n", buf.packet_cout);8 k6 T. w+ D2 J1 O2 {- b$ |
                count_copy = buf.packet_cout;
( z: m9 Y2 g! _0 O. _' n        }: o6 k6 S* m2 h; W
        else0 d4 {, A+ A' e& Z8 h
        {
# Y# K$ D2 C( Z* L+ u                printf("No effective message!");8 @: z- t  l, E+ C, f7 J
        }- }3 l. E: B% h& T# j$ @
}
# V) ]( B6 H% {6 |" q/ u5 V- O) X7 k- u; q; L+ S
6 |0 v- R2 V' \! V) O$ e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 q- X. ?7 ^/ I使用下面代码,对内存使用了mmap函数后:4 f+ H  v* C! t( v! x
#include <stdio.h># r; T4 G' S- d
#include <unistd.h>' y/ S7 s* h+ M+ B& D$ B4 Y% C! U8 [
#include <sys/mman.h>
5 G! d$ o& \( a9 \! W: }#include <sys/types.h>% x) w0 {" N3 Z4 R
#include <fcntl.h>
+ E; e" Y$ @0 y) Z) ~1 f" Q  t) S# A% e
#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 x9 ?. K/ [8 x$ H5 j  |% _" D#define SHAER_RAM_SIZE         (0x20000)   
/ R: x. H9 s# `' n# t. c5 r1 @4 n! @# G! ^
typedef struct0 Z" R- T# y+ q- j1 O0 ]/ `( X
{
" I) [' l3 u9 u) Y* }        unsigned int a;* y! Q/ q0 M  ?
        unsigned int b;+ E6 x3 `/ n- I! G3 a6 b8 p9 n
        unsigned int packet_cout;
3 }: F6 O6 J, a, i! V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% S& @" _0 V/ ~! j2 v

8 n& w( m) L) S: v# s( ~" fvoid read_MSG_buffer(int *baseaddr);
4 n/ C& c/ X; [1 q- P" lunsigned int count_copy = 0;! e4 z( s/ I) c
! |0 d  h4 c$ q# c
int main()
% A0 X$ G8 m7 }) T* G{8 x0 d; {8 j, i
        int fd;
$ a! {: o9 i: r9 Q' O( f+ D        int *mem = NULL;
8 @' h# S/ v8 Y) R- F  ~% I
* a+ H! R. Y) ]. q2 q% e        if((fd = open("/dev/mem", O_RDWR)) <0)" b0 v5 N5 t9 c" U4 T4 d4 [$ @
        {3 g+ O" N  j3 H& i# Q/ V$ ?
                perror("open error");1 l' E6 O! X9 h- c
                return -1;
$ `+ l& }+ \; @5 M        }4 l* @. v2 G% x5 ~
        
: Z8 z5 q# ?7 A3 g        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( w  n. ?% D3 h: k" U0 W  ?% b9 i" s4 k7 A# D
        while(1)
. t% T+ s* @+ l6 _  R        {
8 v2 j- y- K8 |- b& r- t( |) M                read_MSG_buffer(mem);
) {- C- o9 Q! d' o        }                ! X1 ]0 q- s% o% _
}+ b/ {# w2 s) k; s0 v* d
- [2 b5 J8 k/ c, f
void read_MSG_buffer(int *baseaddr)6 O7 U0 h+ @+ R* s0 i7 z
{
; W3 v9 c6 [: R% I: z3 e0 e& G        pRX_MSG_PROTOCOL pshreRAM = NULL;
# j" T! K" \+ ~
& v! k1 _$ N/ O        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, h: i# p) G1 \/ M! i& |1 S
& F+ v8 G1 ]" l% A+ f# |  O        if(pshreRAM->packet_cout != count_copy)
, Y# f# Q: i' V" E7 ?( @        {
8 \  R5 O7 ^. k' l4 Y8 Y; ^! S                printf("a is %d\n", pshreRAM->a);$ C2 x9 \7 C  Z. p7 p
                printf("b is %d\n", pshreRAM->b);; K. v8 Y) [" w  i+ M, ^6 {6 b* I
                printf("count is %d\n", pshreRAM->packet_cout);
8 c6 I% S! ]2 C. J4 w% B: i                count_copy = pshreRAM->packet_cout;
" v' W" N: Z4 N' y& b2 |, _4 m7 M        }
$ X% R. Y4 [1 C# j) x# P        else
$ `) _8 M. x" m: N7 @        {  }9 R: I7 t* Y* ]4 k2 z* i  z2 R5 B
                printf("No effective message!\n");
# h0 w' M# O5 @! b1 n0 j+ e+ r1 n        }
! M# G- Q0 X2 h1 L! Z}
! z, L/ h; n0 y# d
, q7 F' w) |0 D% {* w" `7 g8 F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ m+ @& b& J9 d2 _% }9 J& }* M

" {5 J  w. k# b& q. j' a1 V+ P- w5 M0 o- J$ {- p
, s9 |1 P( U& r' |
, Q- `; j! M! R* X* `2 a1 q1 {" x% V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 22:15 , Processed in 0.041808 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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