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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 M( s. Q5 O( s
6 w6 h4 C; N+ I- A# F- X/ J- KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 o8 ?0 n& N$ Q# I
#include <unistd.h>
  \: C* M3 X& `- b#include <sys/mman.h>) R9 ~; p, m) Z; ^' J
#include <sys/types.h>
' T+ Z" t4 s( E; x' G2 j#include <fcntl.h>1 l9 H3 C  L/ M, t/ R9 b) [1 D: }

) T! |1 x8 @$ k+ n#define SHAER_RAM_BASE_ADDR    (0x80000000)   
! J6 D. q( Y$ r* d
$ K0 E* l- C0 e8 ?2 {0 j5 E) btypedef struct
" O3 r) S" S: }  O' }+ U{; o6 ]  |0 H& q! C* Y2 M
        unsigned int a;! F' t8 l4 o5 @# j* G0 H
        unsigned int b;0 B& A/ P' l) c" L2 m* D
        unsigned int packet_cout;. C% c2 S# b9 s/ X! X4 k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 _* O0 X$ h- T4 p1 Q& r& r( j, z7 P
- y9 p) l& D6 C7 @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 h# P$ N: C- y$ V
unsigned int count_copy = 0;0 j3 I0 h2 d& p! [) [$ w: l
  U8 h- G* k  n* @5 X" X( s

  t" Q: R7 {, T/ `: F4 i; gint main()( i2 b' b7 O" a! ?
{
' Q+ ?$ S  Q% N1 u        pRX_MSG_PROTOCOL pshreRAM = NULL;
! ]/ a' T3 q/ I7 A! q  @        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, f6 ?) `2 b8 F. c$ Z2 h
5 y! |/ n5 |! y$ U9 o3 g" [) g4 Q
        while(1)  y; D+ {# }' z
        {
3 M% q  h* B9 s  P' u                read_MSG_buffer(pshreRAM);
7 v6 ^8 g: F( H5 e3 s        }               
; l- e* {1 `9 f, w  K2 p}
) [& Z- g& P! N% ]) n" v" B! e7 }1 b6 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), C- m) i4 m5 g0 E6 [
{
6 E) ^- n2 j" U; L- f; o5 F2 C( N        RX_MSG_PROTOCOL buf;" B0 ]1 w0 y! x0 A# [" s) }. W# I
        ; ^% }, Y  k3 _
        buf.a = pshreRAM->a;
9 M3 I% h" n* n0 P6 j        buf.b = pshreRAM->b;' G& ~. ?4 `2 i; B: X$ o& V
        buf.packet_cout = pshreRAM->packet_cout;
* h/ f3 V4 k. d9 r- |        
) z! e; Q  l8 b& w        if(buf.packet_cout != count_copy)9 \2 S) q7 [# R- ~) q% R% I+ H
        {, c; J% a$ }4 w# j+ M5 D" ?
                printf("a is %d\n", buf.a);
8 o9 Y- M3 l  R                printf("b is %d\n", buf.b);" [4 ~! a/ H: [% b  c
                printf("count is %d\n", buf.packet_cout);
% ~  b' Y3 y4 b( F                count_copy = buf.packet_cout;3 ^( |" v1 P9 E" C* p" S6 n! |$ ^
        }8 `* T' d: m- l4 a2 S1 h
        else
* }1 q$ U  g( x7 ]; D        {
6 f4 x, G) n+ S& X" M4 q0 r                printf("No effective message!");
4 G2 z* z+ }9 T        }
" T4 Q! k: T  P" }( A$ e}' {) s) g" y( a8 ~0 i! \' t/ g( B
: U: V1 Y+ _' Y7 e
5 g, k* P8 H% I8 ]' F# y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) j: [3 d, G3 M, I" H4 Z( H; u使用下面代码,对内存使用了mmap函数后:
9 e6 ?8 {  b8 c#include <stdio.h>
% s& W- ^! U' b  H9 z! w. [7 ^#include <unistd.h>
  L& H8 P: Q3 C/ [#include <sys/mman.h>
, Q: w, r' k! ~; H0 i" R0 [#include <sys/types.h>
0 ^# h2 O6 r, H8 z) B1 h. `#include <fcntl.h>* z; q  {" g# Q; j; z
# i- P& f: }- C- ?* n+ x
#define SHAER_RAM_BASE_ADDR    (0x80000000)9 g* m: T5 a1 G- `7 w
#define SHAER_RAM_SIZE         (0x20000)   
* q  N0 s9 @  o: i) L6 U
/ U) Z7 h7 ?* Mtypedef struct* ~- X2 W! b, z' r/ _
{
- N/ }3 n5 q" Q* K  Z        unsigned int a;8 @$ o% y% `# Z
        unsigned int b;
! x) i0 Q/ u1 L0 w+ k        unsigned int packet_cout;
0 G' |% t& M3 i2 S6 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- g* c4 o5 v2 I1 m9 e9 @4 X
: {! x6 A: k2 n3 z" O4 s
void read_MSG_buffer(int *baseaddr);
% q0 B0 F( z' [- cunsigned int count_copy = 0;$ }# d$ f( G$ g7 B, E

1 @3 X  C8 o+ t( F% Dint main(). S4 O2 p6 A- V- X
{
/ H$ W: x( q7 b+ N( T+ A5 n        int fd;
/ k% D& D. X$ ?. R+ ?. Q+ ?% S        int *mem = NULL;
+ z" k8 q6 G1 i8 n" ^
2 f* s7 w$ d, c- }( g        if((fd = open("/dev/mem", O_RDWR)) <0)/ o6 }- V0 z. z6 C6 D
        {
& J1 R! N6 X' r9 Q: U                perror("open error");
! t5 S+ s: S+ j, f                return -1;8 B+ ?9 D5 k2 S% o( q$ w- A. N
        }9 c  K/ Y$ h6 k; i. D# W* m
        
7 P  j+ }8 i& M3 Z7 P' I9 S+ l% k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- F3 `* b! R/ i
& W& e! s6 O; e( \        while(1)( B, d/ w/ S* E( a/ t. P. `* @( u
        {1 j3 O) |# @2 p8 y* J
                read_MSG_buffer(mem);& N+ I' i  M$ Q+ l- L5 `
        }                1 N* u5 C# t4 {; K( y
}4 |1 ^( p7 |  k, J" ]- v
& V- s# B+ E! b- L! F8 M9 b% m0 J% u
void read_MSG_buffer(int *baseaddr)
2 y7 C& V6 r8 W, o" F$ |9 \{, m+ d' q/ ?$ [) ]6 ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;" |( X' S' ?  t3 F  w4 D. X  L

$ N1 B& R1 T/ D- s$ b3 s        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% h6 T) v/ K. Z4 @: ?! x( w4 g3 X. F: _: B# y) [
        if(pshreRAM->packet_cout != count_copy)3 X1 d' T$ o& p1 \6 L& `
        {$ z4 T" N& ~% `" ~
                printf("a is %d\n", pshreRAM->a);8 l2 {& W2 J' W" f$ m
                printf("b is %d\n", pshreRAM->b);
. n9 [: H/ H( L# ~( t2 W' C. B0 d                printf("count is %d\n", pshreRAM->packet_cout);
2 C( V+ |. b7 h) W/ @0 M                count_copy = pshreRAM->packet_cout;
* d1 P, [$ f1 V5 c        }
* v: x, J1 }3 s! F; U! P        else
5 |4 Y8 @& A8 A; U: m        {
/ S  F  t, N/ V/ F- R' o) C2 C                printf("No effective message!\n");0 w+ p: i6 F7 _: t  S$ m
        }
3 T/ q1 f+ m  n, m# ]' H}+ N8 u4 Z0 t2 g2 D1 F- ^: Y9 s: ]

6 T% r+ U( L; w# z# l. z; g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  F4 q  D9 }5 e5 N6 S3 w0 j
  z1 e6 D$ y7 r$ Q+ \- [/ e2 \! U
, R7 u. x0 ?  L* T1 l7 C9 @) l: t# [9 Y, I: z" Q
& J8 _" H3 O' X+ Z0 u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-4 16:56 , Processed in 0.044627 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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