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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 o$ z% P3 w6 `5 }' k- ?

$ ]* E7 p3 }8 ^/ d) |( ZOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ k  }9 h0 W/ h9 I' {#include <unistd.h>
, o5 g6 C5 p2 K- g+ N+ c: ]/ `' {#include <sys/mman.h>& J. h# W0 K" m- N
#include <sys/types.h>+ |- c8 [; G: R, M$ B
#include <fcntl.h>
' `5 ]! p$ I3 n2 Q* r1 n$ L+ w9 s
- I. R& H3 D- N9 Y. @#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. {+ G! P5 |& R6 T3 p" a$ P7 O+ i; F1 v9 a; `6 A9 ^, ]; q, s$ G
typedef struct& D! C0 b  C7 n5 x1 z8 ~
{; |  Q4 M: O2 e0 o  y7 Z9 r
        unsigned int a;
9 ]7 S6 z7 i8 R! ~6 A        unsigned int b;" y5 c5 \% |; l, Q+ k
        unsigned int packet_cout;
2 W' _3 m- P4 M7 W4 S) v* j2 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# ~9 g8 q+ l+ k: N% W( j# c8 j. y; m
9 S, K- s/ r/ bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 _7 R- m: o- nunsigned int count_copy = 0;( K( t% v* Z; L3 _* T4 T
/ f& g' p$ e3 Y. z

+ O6 U9 r6 o# b! Kint main()
1 V! J/ _8 d6 b. j  [1 {{9 Z. \9 F- z9 P4 X+ C5 E+ F
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 n# D: F* L3 R- ?/ I
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. l9 ^% b! b) H$ R$ \, Y1 k: \+ X' V( m# Y9 [8 V. }. v9 k/ w
        while(1): `: D) [* z1 j6 N! c, T
        {
/ n3 J! o5 t( J# k* S2 C                read_MSG_buffer(pshreRAM);
3 U, A; S3 B' k6 U        }                ! B- X. v- s# y. _2 P4 _
}  B) w8 X$ N2 k+ H$ h$ O# Y3 L  @" }
/ c, K0 r* u( e, C& e! b# D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' |! h. z5 I" [  c% H3 s7 k9 O
{  k- Q9 q# P0 a* n0 A0 s# f
        RX_MSG_PROTOCOL buf;- U+ T* e/ Q& v) v& ~$ Z" i
        
; i/ I  z/ T7 H7 l: \- E        buf.a = pshreRAM->a;. u8 a5 n. m4 C7 u4 p# a
        buf.b = pshreRAM->b;+ ?, V6 j( V9 s; e; e
        buf.packet_cout = pshreRAM->packet_cout;" W" \4 M. u- G& r- ]$ @
        
5 {: [2 Q4 A  J8 h. C) R6 n        if(buf.packet_cout != count_copy)
+ J9 l7 ?' \, O) J        {  z1 M( \8 e6 K/ ]4 m3 ]
                printf("a is %d\n", buf.a);6 C( U+ }! o8 `1 G/ R
                printf("b is %d\n", buf.b);
. B; ]7 c( ~7 {' C  Q; p' E# \                printf("count is %d\n", buf.packet_cout);
/ m, j8 I0 Q/ J                count_copy = buf.packet_cout;, G* `& @5 l5 x/ ^
        }& [! x' V. F# E( P! T) Y3 P
        else
# X) U/ R, ^; C7 K( f& Y        {
3 T- t8 M1 F: f$ L& i! R. C- t- ]                printf("No effective message!");! @1 ]3 ^, u! x4 b+ [+ x7 l$ m
        }6 f5 @4 Y# {- y6 B
}
9 L; \# B7 u! D3 M/ M8 Y" V$ x; H- o# Z% V8 m
& ?; F2 u# X8 y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' [, y5 w  u. f. a$ n+ z/ d' X
使用下面代码,对内存使用了mmap函数后:
4 u) b% H2 @- m- ?: U#include <stdio.h>
! @" i6 R9 M& i& k( ~& Z* a#include <unistd.h>
8 c7 ], s5 `* j: B% S* V* m#include <sys/mman.h>
1 N/ R0 w5 z# U; U. [1 Q#include <sys/types.h>7 x% R8 R; ?$ e; j
#include <fcntl.h>
2 n6 l* L7 E0 R/ }
* F0 }$ I; ^. D( i% e3 C+ G5 M#define SHAER_RAM_BASE_ADDR    (0x80000000)  x( G* [2 U. I  k& F
#define SHAER_RAM_SIZE         (0x20000)   
; z; _4 ?" I: q1 P5 H
! v2 E/ |$ l3 n& [+ Q- t% Otypedef struct
5 D$ H: I6 z. O) K! u  {2 b{
! M' X  k5 @! \/ n2 Y9 Q        unsigned int a;
' ]# v+ n5 w4 y0 X, f        unsigned int b;6 R5 S3 E4 \. j/ J1 L5 j
        unsigned int packet_cout;
$ ~" G. U) F. `8 U" x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% w6 z2 u8 W% q) {

. U* A* \& n0 s( B9 ]3 ~void read_MSG_buffer(int *baseaddr);
# c' h' a5 ~* W) f( Funsigned int count_copy = 0;: [9 Z3 K+ K! G) ?7 w* p
( t1 _# ^- ~( V
int main()* M8 z& {  m  i, j4 d! ]
{' g) S# M3 I& ^
        int fd;, a3 X9 w. v" S/ A  {+ \
        int *mem = NULL;6 Z8 H) [5 I% D; C, x$ A0 G
$ J  h1 @* M& Y9 j5 L( I
        if((fd = open("/dev/mem", O_RDWR)) <0)+ [5 Z0 T" G8 E2 j3 @3 |( _+ `
        {5 e  o- _7 {% Y; h# G, v& R
                perror("open error");0 O! |6 C' i$ E7 U" p' m* G
                return -1;
) V# M3 t3 S  [6 M3 X0 g/ y        }2 z  A# n( \$ ]& P' |# D4 Y
        
/ ~( o) q8 r; W9 @        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# I/ [8 J1 @4 d
, [+ B" S7 W/ A8 V# J, x        while(1)
5 L# H' I& |+ ~8 m% b: T        {0 i7 @4 M; k9 s# a
                read_MSG_buffer(mem);, ^+ a, y) M9 G* w2 k/ ^
        }               
) {/ t* h6 z' P6 R% r. {}3 Q& m3 S, s$ B) v, ?" Q

, v* i6 [* C* z# g/ U: o; Vvoid read_MSG_buffer(int *baseaddr)4 f! I3 s% k8 l& j9 l8 C
{2 r# \' G/ G' q4 X4 z+ {/ p. F
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 X; c7 O. f- H0 ?! V* N

9 H) J( k! h. M1 N& z( W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 f4 ^5 A& f6 W# @, Z( W& W" Z* G% R8 S  V1 W) g- }9 r
        if(pshreRAM->packet_cout != count_copy)
* z# \0 m* K4 C  f        {3 A  F' f' r# p4 I2 A  d$ ^; o0 R
                printf("a is %d\n", pshreRAM->a);* G- ]* d. }& T0 w
                printf("b is %d\n", pshreRAM->b);
; ~9 \2 `9 D5 H. O6 q/ n                printf("count is %d\n", pshreRAM->packet_cout);
4 n# [( T( n9 K) k, g9 h" _                count_copy = pshreRAM->packet_cout;
1 {7 J* M9 ?5 T+ c! _/ f        }
3 A7 }$ L9 p% H) t4 o$ _& C- T        else4 G( y; ~( k4 T6 ~/ h& e) g
        {- B( h1 B+ c8 x* g9 q; q
                printf("No effective message!\n");
8 x# y$ J! n. v1 Y0 }' I        }, ^8 ^  Y* k# C
}
/ k% c" P$ O" [3 r
/ t" v7 D! P; k- o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ x. S) e5 P, S8 ]% m2 x/ z
! _- l* A8 j! N8 n
+ u0 {7 _1 C3 b) X" {5 a) S& k, L2 u5 g7 ]

. J# e( }- `. H: B1 r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 11:14 , Processed in 0.043474 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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