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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ ?) u3 r- X7 E2 o3 S: M9 t5 F% ~
/ m+ G" f8 g6 |7 L/ B$ N9 `
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ v. }% g% Q% g% V* P
#include <unistd.h>
( W7 W% h: J) v4 R8 F: ?# }#include <sys/mman.h>
. G: @) o& m, `; N1 g#include <sys/types.h>
0 J) v+ u# u+ p#include <fcntl.h>
( C# F8 F! C. F7 R
& y, K! d! l6 y2 l* g% K; k#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  {3 c7 j5 w6 s0 z- u+ C
  q4 j- {% P/ a2 B! \0 U5 {2 Ztypedef struct0 |0 e+ h, {  y; Z+ E9 V
{
! G3 L: U- x7 Z        unsigned int a;$ W7 |/ ?: q( I: i# A) R$ t
        unsigned int b;
) j- {" @0 \- ?. E        unsigned int packet_cout;5 L. ^$ [% Z$ z, l" T' y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 [( v, x. d5 t) E. y" Q$ I

( I/ a1 ^- I. T& \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: G' A- r* L$ u
unsigned int count_copy = 0;
# d7 V! t+ k1 k5 Z( ~. o3 r; S8 q6 a

& }) E" y" z% }2 V& {int main()# a/ v: X# B# l$ L. S
{5 w% Z9 y, G6 w
        pRX_MSG_PROTOCOL pshreRAM = NULL;: y/ M6 ^4 o# A, l; ?5 ?& @  W6 [
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ B, |* l' j7 C6 }5 O
" F5 K# s  M; u5 |, F
        while(1)
) X3 l$ _4 ]  T- v$ o        {# Q( `0 e3 F; {+ M
                read_MSG_buffer(pshreRAM);+ W# L2 k: T2 B9 b
        }                ' R7 `/ J4 s8 E9 W* B+ h# C
}
1 N# u! b9 w# g3 n4 z6 V$ }4 `* e1 s  W$ f; V1 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) j9 H/ G- [  R{6 c- o# k& L4 n- c% G7 |) Z
        RX_MSG_PROTOCOL buf;
  V- W, O% s' ^& e        $ {8 a1 I' f$ t3 n$ E) r$ M
        buf.a = pshreRAM->a;$ m# t1 j5 @2 F# a2 r% X' l4 Y
        buf.b = pshreRAM->b;
' I; O" \; u9 v' b6 \2 W4 \        buf.packet_cout = pshreRAM->packet_cout;
" R. i, U6 b' I9 N4 w        
" k: w3 D+ k% r# i        if(buf.packet_cout != count_copy)
4 U+ ^6 a/ w0 {& Q' o/ ?# w0 n; f        {
$ s; N7 m% K3 f1 A' _$ {8 I# b, a* R! V                printf("a is %d\n", buf.a);
' b' O- V2 l0 R6 x& _                printf("b is %d\n", buf.b);
& _+ d( V" ~/ @7 L                printf("count is %d\n", buf.packet_cout);
9 I# N7 n! w% }6 b, n                count_copy = buf.packet_cout;
9 H" Z+ A: C, ^+ y        }# P3 N/ Z7 b/ \+ x  O  j8 u4 c
        else6 i8 a- e$ O, ?9 d! I; i: Z5 `
        {! `# y7 ~7 c/ F) U8 T' y. Q
                printf("No effective message!");' \/ T6 G7 W1 N* ^
        }& x4 g/ S/ V, v8 q% K# ^" F
}1 c* [6 o" A8 C- d

* n3 j/ G0 C6 T; e" \) K
. R# h& E& k0 E4 k; v但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ c+ }; [* m' E1 `
使用下面代码,对内存使用了mmap函数后:* h; y, R' H5 j3 C7 I  [' {" ]4 C
#include <stdio.h>
) ]6 K; L% R7 _  b#include <unistd.h>
) U- A; M+ h2 h#include <sys/mman.h>: a' t* F# U) b1 k( k6 u) y
#include <sys/types.h>
" _  }/ ~& M% E& F#include <fcntl.h>* b6 Y  z- x( [; A# Z' e" E5 @$ O: d* |

. k" j% j' A) ?#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ {: i* N5 u: p. j: F#define SHAER_RAM_SIZE         (0x20000)   
% ^. A; R# T3 o% J
/ Z/ O1 ~) K5 B* B3 qtypedef struct
. |$ y8 L5 z' ~6 B, W. r/ p{
: j0 O7 C. n" J% R7 Q        unsigned int a;" p. M2 u$ U' I1 G: K
        unsigned int b;8 H5 Y' P% @9 O' a1 A
        unsigned int packet_cout;
0 }: e' g+ @( a6 N* s3 {# [& l  K: L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, ^* _5 W! i0 W( X" q' B

" N/ w; A* G: x7 z( }; q6 r! Rvoid read_MSG_buffer(int *baseaddr);9 p7 n7 P2 c4 [$ n+ [3 k
unsigned int count_copy = 0;
$ ?. D  [6 b! S( h. c* t- F! M, s1 \" d. F2 p$ G
int main(): ]0 r& |0 z, \  V" D" R
{
1 \7 b8 A" [% m6 N- r7 a' T        int fd;
5 E( r& t8 Y  s* [% l        int *mem = NULL;
8 ]3 f% A; V& M2 i" _1 F% L: @# W! P& G6 u: t9 Q3 F3 `
        if((fd = open("/dev/mem", O_RDWR)) <0)
0 _( h. p( m# ~        {, j% _" B* H0 ?. ~6 n6 Y/ e
                perror("open error");! T. H  R$ F! e1 p* H, _9 ^
                return -1;
; c! e: ~+ l+ _8 d3 I2 o        }0 x5 g& y  Y; j8 Q# u$ w  L; ^: \9 N0 n
        
7 \  Q$ t- Q1 w, [0 C2 K        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, j6 R% M2 Q4 e
$ q  c5 p! E5 X        while(1)# x' @7 {4 x6 L' F7 Q6 v, h
        {: M; g7 V. g* e
                read_MSG_buffer(mem);) C/ U6 B6 m6 t# F" Q
        }               
. V1 j: N) Y) ~$ p; j3 S* U( N}$ w5 g) o0 P3 M7 E

# q# U2 c4 H6 [- o1 cvoid read_MSG_buffer(int *baseaddr)
6 [1 e; H* b& k8 M8 x& b{
0 s: ^$ }5 z! J4 W! @7 V- X5 w9 w        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 C" {! y4 x8 f& a" x( m2 f9 X) V; N* d. N( r2 @, C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 H( }9 L+ }: q+ Z' u+ V, J+ s

- q! M! C( b, B" ]" Z        if(pshreRAM->packet_cout != count_copy)) E1 q7 v8 _. e' I/ h6 p
        {& k3 `) S8 P3 x1 j" F8 T; g
                printf("a is %d\n", pshreRAM->a);
+ c8 {- z, ^0 ^: b                printf("b is %d\n", pshreRAM->b);
; G) Q+ m% @* F) f                printf("count is %d\n", pshreRAM->packet_cout);. j4 u" i& v0 x+ b" |4 w
                count_copy = pshreRAM->packet_cout;! K" `* b9 o$ h" j3 y' ?( [$ J
        }; c% R" y. ~/ w3 J0 H- a
        else
) O+ t/ y8 ?% |+ Z        {
( R3 b( q; C. [9 }3 e                printf("No effective message!\n");
' n& w4 E! h; y  r2 u/ Y        }
& q2 d  c" r( c8 ]}
" w5 N, X4 Z- q  ]$ h+ U. L. _
/ ^+ F9 ?3 b7 D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 P8 m2 P+ @) _8 f# e( D

/ t9 W5 f$ U3 D6 q
# H/ p6 g# s8 l! x& n& M! v/ m7 |( ~: q  q2 w

- Q7 Q% ~7 D% S: d/ m+ Q, Y# |# W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-18 18:18 , Processed in 0.039927 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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