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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . s5 C7 h/ e( G, O  M6 ^
" t3 J; z$ m% X, S" ^9 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ S% s. ^9 K4 L, N- Y# q
#include <unistd.h>+ Z5 S1 q% G3 v0 ^  e' m+ \$ N
#include <sys/mman.h>& B+ `6 q" U; Y" s9 W
#include <sys/types.h>
1 v$ {: j: V$ Y) z#include <fcntl.h>
5 A& E# G# a4 ?8 q$ G6 g- u/ H# I# w) [- T
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 i+ }, P( S* X- d
' v" W1 H( g5 V; [+ ?1 xtypedef struct% r4 S) p6 i; F: T# `! q0 m. \
{* l. d4 S/ v; U; v5 G
        unsigned int a;
& q, k( j; Y+ d3 W7 h: J5 d        unsigned int b;9 Z- |6 o. ]' S4 ^7 I& D% O; r
        unsigned int packet_cout;
2 Z* X  `( o- Y# \; c9 Q* q6 Q4 M% O$ M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) p! k* N2 e; Y. d; }  ]
5 i) o' a8 V0 p. ^) ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( F3 p+ ~% ^$ Z* c9 `4 C+ j. j# @/ munsigned int count_copy = 0;/ h: Z3 H% b6 e- L+ i' n1 X6 i- U( R
4 t9 D1 k* E2 u- Y
( V8 m  Z7 k4 W! R
int main()
, P3 F' K, }3 z1 W- C{
) d( @- r2 p( w+ x+ @9 G. }- F. [        pRX_MSG_PROTOCOL pshreRAM = NULL;2 u6 d9 ]4 u+ v4 p) o7 j6 G
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" K, ?# ?+ X9 s' N" m2 Z8 x: N4 B  Z) S' o" @
        while(1)
3 V* {. b0 L9 l1 P0 w% }        {9 L; z' i8 V# C$ |) `, |( }/ r
                read_MSG_buffer(pshreRAM);- u& V1 K" P7 {& n7 {0 q1 P7 ^
        }               
6 D+ e' Z$ b! N( X}, M0 G- s5 y2 F: z; k# ^1 Q; B

, {* l  g3 S1 _6 g: A( Q% f% F% Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 B( Q( a: N+ N& Y9 }3 u
{' J- r; Q4 e6 q& D& G# X+ r
        RX_MSG_PROTOCOL buf;7 f, g5 t1 ~2 @* |# P7 a
        - a/ M8 E) v1 z8 i
        buf.a = pshreRAM->a;
  t% Q' \" ~9 Q- U& y2 F& `  a        buf.b = pshreRAM->b;+ G8 q# B& K9 f! r
        buf.packet_cout = pshreRAM->packet_cout;* L% |& b6 {. `& O+ A3 H+ {3 e7 Z
        * N# i8 L; p+ Z8 A% b* ?, `
        if(buf.packet_cout != count_copy): H; ]* A6 e; o9 ]
        {4 [6 m( G* P! b/ f
                printf("a is %d\n", buf.a);
. I6 O2 Y3 I/ Y, c  K* y- o                printf("b is %d\n", buf.b);
+ H2 |2 F9 U3 @, }                printf("count is %d\n", buf.packet_cout);
& s1 V: Q6 b4 k* k% b: N1 }/ U+ ]                count_copy = buf.packet_cout;4 t$ }" F) a2 e( \5 r3 Z7 \+ W, e  M1 Y
        }
& E+ P+ s, Z0 \% I9 D1 ^- U7 K* d        else- _4 @5 o- O' w. T2 A5 V/ D1 X
        {9 q( P3 P- b$ ^- D
                printf("No effective message!");
& p0 ?1 R5 ]+ C, @+ u  Z' h1 y: e        }
* a% j+ I$ U5 L: z}
  b  T$ r, F  H8 k+ \7 z: t& [& @8 t- H6 E! a- W, X

: u, U/ r4 t- J3 m4 s1 T6 e4 e但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 f% o3 g; p7 ~- E7 y  m* R使用下面代码,对内存使用了mmap函数后:0 N- h) p" b# w. _
#include <stdio.h>
" H* d" y, u4 w9 B' z) F#include <unistd.h>) b% y8 Y9 k' l2 [9 l0 @
#include <sys/mman.h>
" I, K( }* o% a1 B; }#include <sys/types.h>- Q: ]) ?9 V# U7 M; o& u& W
#include <fcntl.h>
6 M0 q1 a5 k) r. X
' d, @" Y0 L* E8 V) t; c' k& \#define SHAER_RAM_BASE_ADDR    (0x80000000)5 B6 h0 B6 r! ?. n( V9 {
#define SHAER_RAM_SIZE         (0x20000)   
# Q( `4 [# f6 m6 d* I6 y8 j8 b1 o& T/ V
typedef struct
8 A  q' @) E" c! X{4 [( R5 f# G: f; u" e
        unsigned int a;
% ^3 B# v5 g& D: n. d        unsigned int b;" u- Q% T8 q; x9 v6 e
        unsigned int packet_cout;
2 D7 ?) K" Q8 [" \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 z: a8 [( H, I# w  y# M$ z' M" `3 |. r, e3 T
void read_MSG_buffer(int *baseaddr);( H7 y7 @" c$ s# d
unsigned int count_copy = 0;, K+ w* k; f  C9 {

# `- Q3 w7 ?! ]- l2 `3 y% zint main()4 }6 z" M# H, o6 R) L
{% a7 C1 O' B/ p4 O3 l5 @8 |
        int fd;
0 Y1 X/ J$ g; a/ I( S6 n# n- i7 b        int *mem = NULL;
9 D' Z' L. g8 m: v3 K6 p' H/ p$ ^" }, \, d$ Q: ~
        if((fd = open("/dev/mem", O_RDWR)) <0)
) {7 `3 t7 k0 a0 e) u: n: X( j4 {        {
% t, \% Q% d- N6 y8 s# [- J                perror("open error");
9 c5 `7 w! A5 w+ R- N                return -1;
, v. j: m. g4 b* P4 `% A        }! t/ E' I$ y& h% x/ k3 V( [! e
        
7 W# X& m( D# s+ X! J% u        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ i  `( i/ ?2 N; Q& i

$ [" E; ~$ k0 v$ b4 B) c6 y& A        while(1)
* x& j& ^# u9 c7 ]        {6 c4 p: D% [# W1 I! l. C
                read_MSG_buffer(mem);8 E- N( }- r; y$ c, u2 N( b
        }                8 q. F* ]# i  K2 b% e5 v
}6 {; b; Y( K! d

# t5 Q& {! J  g# O- I+ u& pvoid read_MSG_buffer(int *baseaddr)
; i: m) Z( m* n; @3 @* {{
9 O- N, V% d  V% w: D        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 }0 {! o) R* b; `: [. N
8 R4 H1 Q0 ]- ^        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' u; ^# X9 n2 f+ C

* u, Q8 v1 O8 X  g$ x# D        if(pshreRAM->packet_cout != count_copy)
. f% }/ z( w. Y8 z& E& G$ g        {8 s( ]5 R$ u) h( l* _4 b
                printf("a is %d\n", pshreRAM->a);
: l& C+ b( Q) s. y1 F7 |                printf("b is %d\n", pshreRAM->b);
" d; T: d, @$ h* b                printf("count is %d\n", pshreRAM->packet_cout);( d6 |. m5 ]. x+ E: i2 R* m4 X
                count_copy = pshreRAM->packet_cout;9 b  b0 U( E9 j, _7 ^
        }
' }, q- O5 a! X# Q        else
0 o8 n/ e4 Y$ k  b( Y        {6 W) |2 E& w; U: H! L  b
                printf("No effective message!\n");
: G# t. W, ]. b  g& ~' H        }, G5 M" ^+ k0 p, Y* z) Y) h
}
. X$ q4 S0 i1 m# g- Y! O$ ~; k3 p. b, w! X" n8 M: s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  B/ m9 m3 d! ?0 Y* _" E" i: x2 Y
9 M6 z: h' G! i+ ^: X' o

' `2 |9 D* Q; [5 a5 b! g
. K5 l% M% s: w1 j
6 U- d1 D$ |0 M' \# Q8 y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 09:31 , Processed in 0.040305 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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