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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 }; V3 ~8 I& j: C  z

5 T5 X; J. c$ p$ ^) o4 U: g8 m% DOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* L4 L: E4 J9 L3 V5 J
#include <unistd.h>! q3 A3 _3 }, f' R  x
#include <sys/mman.h>9 N; X# }4 l  M% B$ B- E
#include <sys/types.h>
' }% T" ]1 q! X% h1 v& W#include <fcntl.h>: b# _5 L7 g/ b3 @# F  L' [1 `$ ~: y
1 e+ ~) P2 N8 z. `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , d  C) k4 r0 z0 ~8 K3 [8 K1 B+ r3 n

7 z' n8 I5 P: Y1 ]& ?typedef struct) q  |# |1 H' w! m( L
{
3 p" v: E" Q; c, V  `# D* T        unsigned int a;8 ]( l; I4 Q% [% Q# e/ _9 J" f( Y
        unsigned int b;
3 ~; U% C  b+ M5 j  I1 L        unsigned int packet_cout;
; i- v8 v! ?/ ^6 e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 d1 Y* W3 E& ]3 s* F2 R+ R

9 [  i( ~7 u* {% q6 _9 M. v$ cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  d3 A; i0 ^8 |0 P$ V+ v' I: s2 |unsigned int count_copy = 0;
. o) o$ D- N8 ]' H8 t' X+ j. {* W1 G) C. \* L6 O" e
  x' D) n& ^4 T2 k! N# l
int main()" w# Q' |8 X$ J
{
3 S" \; p6 @0 G; k3 Z2 t        pRX_MSG_PROTOCOL pshreRAM = NULL;
: N3 T5 X. i5 l4 m0 N        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& s& Y+ z& Y( c& M# I+ Q
3 ~. o) f7 A6 _2 h        while(1)! [8 k5 Y6 B* L1 R: Z9 s) G- S
        {2 B& v6 {; m8 x0 x! [" r
                read_MSG_buffer(pshreRAM);
; V' p8 b: u& j1 m$ G        }               
+ j" ^  P" T( l- d}9 b# j  i; C: j

6 N0 q9 Z8 N/ I' W* h0 R4 `/ Q, K8 wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 Z+ `+ q7 E5 G: s{
7 j: Q  z! ^3 \$ M6 n        RX_MSG_PROTOCOL buf;, v& n- C+ M5 a* \7 ~$ e8 s
        
& Z' R3 p# @7 {8 Y5 h; ~- _        buf.a = pshreRAM->a;
) F; a$ U  r! ]4 K$ _9 P5 I7 u        buf.b = pshreRAM->b;8 y( }8 A* M3 V5 o, w% p& P
        buf.packet_cout = pshreRAM->packet_cout;9 p7 |2 Y) c% R; G5 u; [: O
        
+ S; ~! d1 m  h3 H4 D* T        if(buf.packet_cout != count_copy)
' X+ e$ L- o; n7 O6 O  k* c4 e        {: ?1 _- I/ V" ^3 F0 e; i1 C
                printf("a is %d\n", buf.a);9 Y+ v7 v. E" A$ D' r& ^% \" u5 E
                printf("b is %d\n", buf.b);7 b( g* \2 l& x* E1 O; \
                printf("count is %d\n", buf.packet_cout);; H/ i' @- F  M  k5 [
                count_copy = buf.packet_cout;
/ l! A7 @1 n! F' \$ _( y        }% `6 d# G( k' a8 R& H9 W. |
        else  ]; V- t  }* g0 f& G) p! T4 d  V
        {$ i3 @3 ?' D; b* y$ i$ Q, Z' E& p
                printf("No effective message!");) t4 v, F9 s( p! x6 ?" z
        }' @' m1 K/ _  ], {8 `# i; S
}
- ~- Y1 T* }' g$ Z3 d/ w& u* U9 L% ]* q- i3 S8 D- o
+ w. l& U" e! i* d6 O9 T1 j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  i7 s8 I# s) u# J6 D' A使用下面代码,对内存使用了mmap函数后:! R/ `8 K- l: O3 Q4 ]4 z/ S7 |
#include <stdio.h>
$ ~: b9 o" H) ^( }) s1 k#include <unistd.h>9 U. l" R9 U7 b, c$ _
#include <sys/mman.h>, Z. J& t6 c+ C! B7 ]6 J) v6 @$ N
#include <sys/types.h>
& v8 ~& A, i- r6 y& f#include <fcntl.h># S% ]' j3 P4 W( O, C$ q4 u0 V
) ]  }- F6 P- J9 M) i
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 \6 T* X  k$ J# S. [- N- F#define SHAER_RAM_SIZE         (0x20000)   
4 ^' @8 T$ u* u' }' G. e! L, k* W" T( ?
typedef struct
" K3 S  S, {4 r; M# J$ I{. \4 w! {9 B$ s( ~9 ?4 P9 L2 E& ^( |
        unsigned int a;
. \8 [4 C- c9 ~( Q; e( q        unsigned int b;
% g( r3 u0 @2 y; ?! {  x7 H        unsigned int packet_cout;
9 a3 T* j- G  F9 q% U* s) s% p* v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 i9 N! p# h; j) k" p

) c4 W$ W* G* zvoid read_MSG_buffer(int *baseaddr);
; \2 w# K' `: runsigned int count_copy = 0;
" F5 r1 ^* p2 @0 m1 Z; U' O8 g$ E" }& C
int main()
/ f6 I% m8 O" l2 X+ s3 ]8 D% d* w{
( Q- m' p; K$ s9 H) p        int fd;+ m, W' k$ k5 e0 G( p
        int *mem = NULL;
& k. Z% D  T  |" \7 `" n+ h! G. A" |0 p, v) |
        if((fd = open("/dev/mem", O_RDWR)) <0)5 M8 I. _5 `7 j3 z) w7 [
        {' s0 M) f; H! T- W7 |
                perror("open error");
0 p# n" x* v+ \9 t" O5 D- ^                return -1;
( w- M8 X4 D- e) a$ M        }
4 A/ B/ x4 s9 S! E        
! `) R/ C7 ?8 |6 F        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 Y( h$ k; y5 [9 ^. S; B* K1 I

' m- u' ^8 k; d9 B7 A        while(1)' Z* q$ M% E" x: U. a1 H9 N! q
        {
/ C, b* F- E2 B. \5 N) {                read_MSG_buffer(mem);
( r; R1 o8 k; M9 x        }                8 a/ _6 {: S7 Q
}5 D; I2 N1 l. z( b( t& D
1 ?4 T" c, d. X+ ~4 _+ b
void read_MSG_buffer(int *baseaddr)
; v1 y4 ~1 e! f+ U" f  d; c' o{
( n4 @  [7 }2 f3 D( M$ X        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 h6 g3 G; Z8 U9 t; f
! _& \9 d( _+ N: ^        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 s: @" G5 E" J' F; m1 W" O

; K! A3 \, f- h$ \        if(pshreRAM->packet_cout != count_copy). C# J5 E+ ]! ?' Y& t2 I! R
        {1 H' `/ y! h6 a5 s! r' V! o
                printf("a is %d\n", pshreRAM->a);. e* A" H$ X! N2 x
                printf("b is %d\n", pshreRAM->b);
+ \8 k0 M- r+ J4 q                printf("count is %d\n", pshreRAM->packet_cout);
5 o8 k" s1 m/ W/ G5 f: f                count_copy = pshreRAM->packet_cout;
5 |; C8 |- v. g% `2 I2 o        }
6 z3 l( Y7 O  s) X5 g) L( `+ N0 l( t        else
. E8 ?* b- h/ ^6 X        {. g* h( C/ q: J. s
                printf("No effective message!\n");
9 L1 x" u" |9 p: r2 V        }
( T% O& |' }' K; I2 B: o}8 o' k# B& `- l. ]! h
6 e/ n  C+ i. i* T3 q" [( l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' ?# O' N; n3 _( }9 p  o+ N: ~

3 ?' R1 D: L2 o0 `) A' P( \* q$ t0 m- m5 B* x
0 T7 y$ [, Q: J" f3 i
. y' O/ A0 q4 H" \$ x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 15:36 , Processed in 0.041979 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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